Подтвердить что ты не робот

Почему = {} инициализация не работает для кортежа?

Мне a pair является только особый случай a tuple, но после меня меня удивляет:

pair<int, int> p1(1, 2);   // ok
tuple<int, int> t1(1, 2);  // ok

pair<int, int> p2={1, 2};  // ok
tuple<int, int> t2={1, 2}; // compile error

Почему существует разница, когда мы используем {} для инициализации tuple?

Я пробовал даже g++ -std=c++1y, но все еще имел ошибку:

a.cc: In function 'int main()':
a.cc:9:29: error: converting to 'std::tuple<int, int>' from initializer list would use explicit constructor 'constexpr std::tuple<_T1, _T2>::tuple(_U1&&, _U2&&) [with _U1 = int; _U2 = int; <template-parameter-2-3> = void; _T1 = int; _T2 = int]'
     tuple<int, int> t2={1, 2};
                             ^
4b9b3361

Ответ 2

В дополнение к Praetorian's правильный ответ (который я поддержал), я хотел добавить немного больше информации...

Post-С++ 14, стандарт был изменен, чтобы:

tuple<int, int> t2={1, 2}; 

для компиляции и ожидаемой семантики. Предложение, которое делает это N4387. Это также позволит создавать такие конструкции, как:

tuple<int, int>
foo()
{
    return {1, 2};
}

Он допускает это только в том случае, если все T в tuple неявно стираются из всех аргументов.

В качестве несоответствующего расширения libС++ уже реализует это поведение.