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