Ответ 1
Списки инициализаторов не относятся к кортежам.
Я думаю, что вы смешиваете два разных использования фигурных скобок в С++ 0x.
-
initializer_list<T>
является однородной коллекцией (все члены должны быть одного типа, поэтому не актуальны дляstd::tuple
) - Унифицированная инициализация - это то, где фигурные скобки используются для построения всех видов объектов; массивы, POD и классы с конструкторами. Который также имеет преимущество решения самого досадного разбора)
Здесь упрощенная версия:
std::tuple<int, char> t = { 1, '1' };
// error: converting to 'std::tuple<int, char>' from initializer list would use
// explicit constructor 'std::tuple<_T1, _T2>::tuple(_U1&&, _U2&&)
// [with _U1 = int, _U2 = char, _T1 = int, _T2 = char]'
std::tuple<int, char> t { 1, '1' }; // note no assignment
// OK, but not an initializer list, uniform initialization
В сообщении об ошибке говорится, что вы пытаетесь неявно вызвать конструктор, но это явный конструктор, чтобы вы не могли.
В основном то, что вы пытаетесь сделать, выглядит примерно так:
struct A {
explicit A(int) {}
};
A a0 = 3;
// Error: conversion from 'int' to non-scalar type 'A' requested
A a1 = {3};
// Error: converting to 'const A' from initializer list would use
// explicit constructor 'A::A(int)'
A a2(3); // OK C++98 style
A a3{3}; // OK C++0x Uniform initialization