q09*_*987 4 c++ templates overloading overload-resolution
我看到了以下代码:
class NullClass {
public:
template<class T> operator T*() const { return 0; }
};
const NullClass NULL;
void f(int x);
void f(string *p);
f(NULL); // converts NULL to string*, then calls f(string*)
Run Code Online (Sandbox Code Playgroud)
Q1>我有理由理解以下声明
template<class T> operator T*() const { return 0; }
Run Code Online (Sandbox Code Playgroud)
特别是,是什么意思operator T*()?
Q2>为什么f(NULL)最终触发f(string*)?
谢谢
Jam*_*lis 11
是什么意思
operator T*()?
它是用户定义的转换运算符.它允许将类型的对象NullClass转换为任何指针类型.
这样的转换操作符通常会导致细微的,意外的和有害的问题,因此在大多数情况下最好避免它们(当然,它们偶尔会有用).
为什么
f(NULL)最终触发f(string*)?
NULL是类型的NullClass.它不能转换为a int,但用户定义的转换NullClass -> T*可用于将其转换为a string*,因此void f(string*)被选中.
请注意,这是有效的,因为只有一个重载f需要一个指针.如果你有两个重载,
void f(int*);
void f(float*);
Run Code Online (Sandbox Code Playgroud)
调用将是不明确的,因为NullClass -> T*转换可以转换为int*和float*.