Nano Hash - криптовалюты, майнинг, программирование

Как сделать вложенные Initializer_lists в Visual C++ 2013

У меня есть программа, которая работает в g++ и clang, используя вложенный список initializer_list. В Visual C++ одномерный вариант работает, а двухмерный вложенный список инициализаторов — нет. Есть ли трюк, чтобы заставить Visual C++ работать, или это может быть ошибка в их реализации?

Вот мой пример кода. Он работает в Visual C++ 2013, если я удалю аннотированную строку.

#include <iostream>
#include <initializer_list>

using namespace std;

template<class T>
void print(T val) {
    cout << val;
}

template<class T>
void print(initializer_list<T> lst) {
    bool first = true;
    cout << "[";
    for (auto i : lst) {
        if (!first) cout << ", ";
        print(i);
        first = false;
    }
    cout << "]";
}

template<class T>
void print(initializer_list<initializer_list<T>> lst) {
    bool first = true;
    cout << "[";
    for (auto i : lst) {
        if (!first) cout << ", ";
        print(i);
        first = false;
    }
    cout << "]";
}

int main()
{
    print({1, 2, 3});
    cout << endl;
    // Without this line, Visual C++ 2013 is happy
    print({{1, 2}, {3, 4, 5}, {6}});
}

  • VС++ не соответствует стандарту. 31.05.2014
  • Visual Studio — медленное детище компиляторов. 31.05.2014
  • Реализация VC initializer_list содержит ошибки. См. этот вопрос и другие под связанными вопросами справа от этого страница. Ваш код правильный, и вы нашли еще одну ошибку. Вы должны сообщить об этом в Microsoft Connect. 31.05.2014
  • Я сообщил о проблеме в Microsoft подключить, спасибо за отзыв! 31.05.2014
  • @mwiebe Об этом уже сообщалось несколько раз. Вы уже обновили свой VS2013 с помощью Update1? Насколько я знаю, эта ошибка уже исправлена. 31.05.2014
  • @polkovnikov.ph: У меня установлено обновление 2, но этот код все еще не компилируется. 31.05.2014
  • @polkovnikov.ph, хотя мой VS2013 не был обновлен, теперь я обновился до обновления 2 и могу подтвердить, что он по-прежнему не работает, как и раньше. 02.06.2014
  • @SyntacticFructose Visual Studio может по-разному. 26.07.2014

Ответы:


1
template<class T>
std::initializer_list<T> list( std::initializer_list<T>&& l ) { return std::move(l); }

или что-то подобное может, по крайней мере, дать вам обходной путь:

print( { list({1,2}), list({3,2,1}) } );

синтаксис также можно использовать с (l*{2,1}) несколькими способами.

26.07.2014
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..