Это изменение было добавлено P1021R4 , в частности P1816R0 , в котором добавлена поддержка вывода аргументов шаблона класса для агрегатов.
Специфическая формулировка c может быть находится в [over.match.class.deduct] / 1 , который добавляет, в основном, руководство по неявному выводу для агрегатов:
Кроме того, если C
определено и его определение удовлетворяет условиям для агрегированного класса ([dcl.init.aggr]) с предположением, что любой зависимый базовый класс не имеет виртуальных функций и виртуальных базовых классов, а инициализатором является непустой braced-init -list или список выражений в скобках , и нет deduction-guides для C
, набор содержит дополнительный шаблон функции, называемый совокупным кандидатом на дедукцию, определенным следующим образом. Пусть x1,…, xn будут элементами списка-инициализаторов или списка-назначенных-инициализаторов из список-инициализаторов в фигурных скобках или список-выражений . Для каждого xi пусть ei будет соответствующим агрегатным элементом C
или одного из его (возможно, рекурсивных) подагрегатов, который будет инициализирован xi ([dcl.init.aggr]), если
- исключение скобок не учитывается для любого агрегированного элемента, который имеет зависимый тип без массива или тип массива с зависимой от значения границей, и
- предполагается, что каждый не завершающий агрегатный элемент, который является расширением пакета, соответствует ни к каким элементам списка инициализаторов, и
- предполагается, что конечный агрегатный элемент, который является расширением пакета, соответствует всем оставшимся элементам списка инициализатора (если есть).
Если нет такого агрегированного элемента ei для любого xi, агрегированный кандидат на вывод не добавляется в набор. Кандидат на совокупный вывод получается, как указано выше, из гипотетического конструктора C (T1,…, Tn), где
- , если ei имеет тип массива, а xi - список инициализации в фигурных скобках или строка. -literal, Ti - это ссылка rvalue на объявленный тип ei, и
- в противном случае Ti - это объявленный тип ei,
, за исключением того, что дополнительные пакеты параметров в форме Pj ... вставляются в список параметров в их исходной позиции агрегированного элемента, соответствующей каждому незавершенному агрегатному элементу типа Pj, который был пропущен, потому что это был пакет параметров, и завершающая последовательность параметров, соответствующая завершающему агрегатному элементу, который является расширение пакета (если оно есть) заменяется одним параметром формы Tn ....
В основном, руководство по вычету, которое вам приходилось писать раньше:
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
теперь просто выпадает из языка.