17 Templates [temp]

17.8 Function template specializations [temp.fct.spec]

17.8.2 Template argument deduction [temp.deduct]

17.8.2.3 Deducing conversion function template arguments [temp.deduct.conv]

Шаблон вывод аргумента делается путем сравнения тип возвращаемого шаблона функции преобразования (назовем его P) с типом , который необходим в качестве результата преобразования (назовем его A; см [dcl.init], [over.match.conv]и [over.match.ref] для определения того типа) , как описано в [temp.deduct.type].

Если P это ссылочный тип, тип, на который ссылается, P используется вместо P вычитания типа и для любых дальнейших ссылок или преобразований P в оставшейся части этого раздела.

Если A это не ссылочный тип:

  • Если P это тип массива, то тип указателя, созданный объектом, array-to-pointer standard conversion используется вместо P вывода типа; иначе,

  • Если P это тип функции, тип указателя, созданный с помощью function-to-pointer standard conversion , используется вместо P вывода типа; иначе,

  • Если P это тип с квалификацией cv, квалификаторы cv верхнего уровня Pдля типа игнорируются при выводе типа.

Если A это тип с квалификацией cv, квалификаторы cv верхнего уровня Aдля типа игнорируются при выводе типа. Если A это ссылочный тип, тип, на который ссылается, A используется для вывода типа.

В общем, процесс вывода пытается найти значения аргументов шаблона, которые сделают вывод A идентичным A. Однако есть четыре случая, в которых допускается различие:

  • Если исходный A тип является ссылочным, он A может быть более квалифицированным cv, чем выведенный A (т. Е. Тип, на который ссылается ссылка)

  • Если оригинал A является типом указателя функции, он A может быть «указателем на функцию», даже если выведенным A является «указатель на функцию без исключения».

  • Если оригинал A является указателем на тип функции-члена, он A может быть «указателем на член функции типа», даже если выведенным A является «указатель на член функции типа noexcept».

  • Вывод A может быть другим указателем или указателем на тип члена, в который можно преобразовать A квалификационное преобразование.

Эти альтернативы рассматриваются только в том случае, если в противном случае определение типа не удалось бы. Если они дают более одного возможного Aвывода, вывод типа не выполняется.

Когда процесс вывода требует квалификационного преобразования для указателя или указателя на тип члена, как описано выше, для определения выведенных значений аргументов шаблона используется следующий процесс:

Если A это тип cv1,0 «указатель на » cv1,n1 «указатель на» cv1,n T1 и P тип cv2,0 «указатель на » cv2,n1 «указатель на» cv2,n T2, то cv-unqualified T1 и T2 используются как типы A и, P соответственно, для вывода типа. [Example:

struct A {
  template <class T> operator T***();
};
A a;
const int * const * const * p1 = a;     // T is deduced as int, not const int

end example]