显式模板函数参数规范和C ++ 11中函数参数的隐式转换

时间:2012-12-26 04:52:58

标签: c++ templates stl c++11

主题标题冗长而神秘,但问题相当简单。

我正在阅读最新的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]

有人可以向我解释一下,它想说的是什么以及示例中发生的转换在哪里 谢谢!

1 个答案:

答案 0 :(得分:6)

正在进行转换:

f<Complex>(1);

您正在调用期望f的函数Complex,但您传递的是int。从intdouble标准转换和从doubleComplex用户定义的转化。< / p>

标准试图说明的是,当显式为模板函数提供模板参数时,这些行为就像使用这些类型声明函数一样。也就是说,当你调用f<Complex>时,它的行为就像声明:

void f( Complex );

否则,如果未明确指定模板参数,则T将被推断为int,并且不会进行隐式转换。