Явная спецификация аргументов функции шаблона и неявное преобразование аргументов функции в C++11

название темы длинное и зашифрованное, но вопрос довольно простой.

Я читаю 14.8.1 Explicit template argument specification в последнем проекте спецификаций C++11 (N3242=11-0012), страница 375

6 неявных преобразований (пункт 4) будут выполняться для функции аргумент для преобразования его в тип соответствующей функции параметра, если тип параметра не содержит шаблона-параметры, которые участвуйте в дедукции аргументов шаблона. [ Примечание: Шаблон параметры не участвовать в выводе аргументов шаблона, если они явно указаны. Например,

template<class T> void f(T);
class Complex {
  Complex(double);
};
void g() {
  f<Complex>(1); // OK, means f<Complex>(Complex(1))
}

-конец Примечание ]

может кто-нибудь объяснить мне, что он пытается сказать и где происходит преобразование в Примере.
Спасибо !

1 ответов


преобразование происходит прямо здесь:

f<Complex>(1);

вы вызываете функцию f что ожидает Complex, но вы передаете его . Есть стандартное преобразование С int до double и a пользовательские преобразования С double to Complex.

стандарт пытается сказать, что когда вы явно предоставить аргументы шаблона для функции шаблона, те ведите себя так, как будто функция была объявлена с этими типами. То есть, когда вы звоните f<Complex> он ведет себя так, как если бы провозгласил:

void f( Complex );

в противном случае, если параметр шаблона не был явно указан,T было бы выведено как int и никакого неявного преобразования не произошло бы.