Это скорее предположение, чем цитата из стандарта, но я думаю, что это имеет некоторый смысл.
Проблема в том, что заключенный в фигурные скобки список может означать много вещей.Это может быть списком инициализаторов, но при равномерной инициализации это может быть также любое количество других вещей, таких как агрегатные инициализаторы или просто аргументы конструктора.
Рассмотрим следующую ситуацию:
struct Bar { Bar(int, int, int){} };
void foo(const std::vector<int> & v);
void zoo(const Bar & v);
Я могу позвонить как foo({1,2,3})
, так и zoo({1,2,3})
.Поскольку тип аргумента обеих функций известен, нет никакой двусмысленности.И все же аргумент foo
выводится как список инициализатора, в то время как аргумент zoo
является вызовом конструктора равномерной инициализации.
В ситуации кортежа проблема заключается в том, что все задействованные типы являются шаблонами.Тип аргумента конструктора должен быть выведен ;это не известно во время вызова функции.Его истинная роль становится очевидной только в функции body .
Поскольку существует множество способов создания члена кортежа, этот вывод может быть неоднозначным или просто неправильным, и поэтому компилятор предупреждаетВы, что оно делает предположение .
На самом деле, вы можете построить провал этого предположения очень просто:
std::tuple<Bar, std::vector<int>> s{{1,2,3}, {1,2,3}};
Это не даст построить первоечлен кортежа, потому что список скобок выводится неправильно.Единственный «хороший» способ написания кортежей - это явно:
std::tuple<Bar, std::vector<int>> s{Bar{1,2,3}, std::vector<int>{1,2,3}};