Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Разрешены ли кортежи кортежей?

Автор вопроса: Tomaka17Ответов: 2

В настоящее время я работаю над классом с множеством шаблонов, и возможность создавать кортежи кортежей значительно упростит задачу.

Но я попробовал этот простой код в MSVC ++ 2010:

#include <tuple>

void main() {
     auto x = std::make_tuple(std::make_tuple(5, true));
}

И я получаю ошибку компиляции. Та же проблема возникает, если я использую не std::make_tuple, а напрямую std::tuple конструктор.

Это ошибка MSVC или кортежи кортежей не разрешены стандартом?

  • Какое именно сообщение об ошибке вы получаете? Martin B 15.07.2010
  • Это очень-очень долго. Начальная ошибка: c: \ logiciels \ visual studio 10.0 \ vc \ include \ tuple (127): error C2440: 'initializing': невозможно преобразовать из 'std :: tr1 :: _ Nil' в 'bool' Tomaka17 15.07.2010
  • Я подозреваю, что реализация кортежей Microsoft является рекурсивной, но поскольку Type0 уже является кортежем, он сталкивается с чем-то еще Tomaka17 15.07.2010
  • Это также не удалось на g ++ 4.5, но std::make_tuple(std::make_tuple(5, true), 0); в порядке. kennytm 15.07.2010
  • Ваш код также компилируется в VC ++ 2010, вы думаете, что это запрещено стандартом, или это ошибка в обеих реализациях? Tomaka17 15.07.2010

c++visual-studiotuplesvisual-c++c++11

Ответы

Ответ 1 · рейтинг 4 · James McNellis

Больше точек данных:

  • Если мы используем std::tr1::tuple и явно указываем тип вместо использования auto, тогда Visual C ++ 2008 компилирует код без ошибок. Попытка скомпилировать тот же код с Visual C ++ 2010 приводит к появившейся ошибке.

  • Если мы используем boost::tuple и явно указываем тип вместо использования auto, то и Visual C ++ 2008, и Visual C ++ 2010 компилируют код без ошибок.

Похоже, это, вероятно, ошибка реализации.

Ответ 2 · рейтинг 3 · Ben Voigt

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

make_tuple объединяет вывод типа с вызовом tuple конструктора. Когда конструктор tuple вызывается с одним аргументом, который также является tuple, возможно, что конструктор преобразования лучше подходит, чем конструктор оболочки. Отсюда и проблема.

Допускаются кортежи кортежей. 1-Кортежей может и не быть.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы