Согласно этому ответу C ++ 17 поддерживает инициализацию кортежа из инициализации copy-list, однако, похоже, такая поддержка ограничена, так как я получаю следующую ошибку
Проблема в другом.
Когда вы вызываете bar({1, 'S'})
, компилятор знает, что bar()
получает tuple<int, char>
, поэтому примите 1
как int
и 'S'
как char
.
См. Другой пример: если вы определили
void baz (std::tuple<int> const &)
{ }
, вы можете вызвать
baz(1);
, потому что компилятор знает, что baz()
получает std::tuple<int>
, поэтому примите 1
для инициализацииint
в кортеже.
Но с
template <typename ...T>
void foo(tuple<T...> t)
{ }
компилятор не знает типы T...
;когда вы вызываете
foo({1, 'S'});
, какие T...
типы должны выводить компилятор?
Я вижу, по крайней мере, две гипотезы: T = int, char
или T = std::pair<int, char>
;или также T = std::tuple<int, char>
.
Какая гипотеза должна следовать за компилятором?
Я имею в виду: если вы передаете std::tuple
в foo()
, компилятор принимает список типов в кортежекак список T...
;но если вы передаете что-то еще, компилятор должен вывести правильный std::tuple
;но этот вывод, в этом случае, не является уникальным.Итак, ошибка.