C 11中函数参数的显式模板函数参数规范和隐式转换
Explicit template function argument specification and Implicit conversion of function arguments in C++11
主题的标题是漫长且隐秘的,但是问题很简单。
我正在读取最新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
。有一个标准转换从int
到double
,并且A 用户定义的转换从double
到Complex
。
标准试图说的是,当您显式向模板函数提供模板参数时,这些函数的行为就像是用这些类型声明的函数一样。也就是说,当您调用f<Complex>
时,它的行为就好像声明了:
void f( Complex );
否则,如果未明确指定模板参数,T
将被推论为int
,并且不会进行任何隐式转换。
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类