7

该主题的标题很长而且很神秘,但问题很简单。

我正在阅读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))
}

——尾注]

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

4

1 回答 1

6

转换就在这里进行:

f<Complex>(1);

您正在调用一个f需要a 的函数Complex,但您正在传递它 a int。有从 to 的标准转换和从inttodouble用户定义double的转换Complex

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

void f( Complex );

否则,如果没有显式指定模板参数,T将推导出为int,并且不会发生隐式转换。

于 2012-12-26T04:55:50.570 回答