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

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

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

#include <tuple>

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

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

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


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


Ответы (2)


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

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

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

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

person James McNellis    schedule 15.07.2010

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

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

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

person Ben Voigt    schedule 15.07.2010