В настоящее время я работаю над классом с множеством шаблонов, и возможность создавать кортежи кортежей значительно упростит задачу.
Но я попробовал этот простой код в MSVC ++ 2010:
#include <tuple>
void main() {
auto x = std::make_tuple(std::make_tuple(5, true));
}
И я получаю ошибку компиляции. Та же проблема возникает, если я использую не std::make_tuple, а напрямую std::tuple конструктор.
Это ошибка MSVC или кортежи кортежей не разрешены стандартом?
Ответ 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-Кортежей может и не быть.