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

Explicit template function argument specification and Implicit conversion of function arguments in C++11

本文关键字:参数 函数 转换      更新时间:2023-10-16

主题的标题是漫长且隐秘的,但是问题很简单。

我正在读取最新C 11规格草稿中的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]

有人可以向我解释,试图说什么以及示例中的转换在哪里。
谢谢!

转换在这里进行:

f<Complex>(1);

您正在调用一个期望Complex的函数f,但是您将其传递给int。有一个标准转换从intdouble,并且A 用户定义的转换doubleComplex

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

void f( Complex );

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