17 Templates [temp]

17.9 Deduction guides [temp.deduct.guide]

Направляющие выведения используются, когда a template-nameпоявляется как спецификатор типа для deduced class type. Руководства по вычету не могут быть найдены поиском по имени. Вместо этого при выполнении шаблона argument deductionкласса учитываются любые руководства по выводам, объявленные для шаблона класса.

deduction-guide:
	explicitopt template-name ( parameter-declaration-clause ) -> simple-template-id ;

[Example:

template<class T, class D = int>
struct S {
  T data;
};
template<class U>
S(U) -> S<typename U::type>;

struct A {
  using type = short;
  operator type();
};
S x{A()};           // x is of type S<short, int>

end example]

Те же ограничения применяются к руководству parameter-declaration-clause по дедукции, что и к объявлению функции ([dcl.fct]). simple-template-id Должен назвать шаблон класса специализации. template-name Должна быть такой же , identifier как template-name из simple-template-id. A deduction-guide должен быть объявлен в той же области, что и соответствующий шаблон класса, и для шаблона класса-члена с тем же доступом. Два объявления руководства по выводу в одной и той же единице перевода для одного и того же шаблона класса не должны иметь эквивалента parameter-declaration-clauses.