主题标题冗长而神秘,但问题相当简单。
我正在阅读最新的C ++ 11 Specs草案中的14.8.1 Explicit template argument specification
(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))
}
-end note]
有人可以向我解释一下,它想说的是什么以及示例中发生的转换在哪里 谢谢!
答案 0 :(得分:6)
正在进行转换:
f<Complex>(1);
您正在调用期望f
的函数Complex
,但您传递的是int
。从int
到double
的标准转换和从double
到Complex
的用户定义的转化。< / p>
标准试图说明的是,当显式为模板函数提供模板参数时,这些行为就像使用这些类型声明函数一样。也就是说,当你调用f<Complex>
时,它的行为就像声明:
void f( Complex );
否则,如果未明确指定模板参数,则T
将被推断为int
,并且不会进行隐式转换。