Формируется набор функций и шаблонов функций, включающий:
Для каждого конструктора шаблона первичного класса, обозначенного template-name, если шаблон определен, шаблон функции со следующими свойствами:
Параметры шаблона - это параметры шаблона шаблона класса, за которыми следуют параметры шаблона (включая аргументы шаблона по умолчанию) конструктора, если таковые имеются.
Типы параметров функции такие же, как у конструктора.
Тип возвращаемого значения - это специализация шаблона класса, обозначенная template-name аргументами и шаблона, соответствующими параметрам шаблона, полученным из шаблона класса.
Если шаблон основного класса C не определен или не объявляет никаких конструкторов, дополнительный шаблон функции, полученный, как указано выше, из гипотетического конструктора C().
Дополнительный шаблон функции, полученный, как указано выше, из гипотетического конструктора C(C), который называется copy deduction candidate.
Для каждого из них deduction-guide- шаблон функции или функции со следующими свойствами:
Параметры шаблона, если таковые имеются, и параметры функции - это параметры файла deduction-guide.
Возвращаемый тип - simple-template-id это deduction-guide.
Инициализация и разрешение перегрузки выполняются, как описано в [dcl.init] и [over.match.ctor],, [over.match.copy]или [over.match.list] (в зависимости от типа выполняемой инициализации) для объекта гипотетического типа класса, где выбранные функции и шаблоны функций считаются конструкторами этого типа класса для цель формирования набора перегрузки, а инициализатор предоставляется контекстом, в котором было выполнено вывод аргументов шаблона класса. Каждый такой условный конструктор считается явным, если функция или шаблон функции были сгенерированы из конструктора или deduction-guideбыли объявлены explicit. Все такие условные конструкторы считаются открытыми членами гипотетического типа класса.
[ Example:
template <class T> struct A { explicit A(const T&, ...) noexcept; // #1 A(T&&, ...); // #2 }; int i; A a1 = { i, i }; // error: explicit constructor #1 selected in copy-list-initialization during deduction, // cannot deduce from non-forwarding rvalue reference in #2 A a2{i, i}; // OK, #1 deduces to A<int> and also initializes A a3{0, i}; // OK, #2 deduces to A<int> and also initializes A a4 = {0, i}; // OK, #2 deduces to A<int> and also initializes template <class T> A(const T&, const T&) -> A<T&>; // #3 template <class T> explicit A(T&&, T&&) -> A<T>; // #4 A a5 = {0, 1}; // error: explicit deduction guide #4 selected in copy-list-initialization during deduction A a6{0,1}; // OK, #4 deduces to A<int> and #2 initializes A a7 = {0, i}; // error: #3 deduces to A<int&>, #1 and #2 declare same constructor A a8{0,i}; // error: #3 deduces to A<int&>, #1 and #2 declare same constructor template <class T> struct B { template <class U> using TA = T; template <class U> B(U, TA<U>); }; B b{(int*)0, (char*)0}; // OK, deduces B<char*>
— end example ]