Явная спецификация аргументов функции шаблона и неявное преобразование аргументов функции в 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 и никакого неявного преобразования не произошло бы.