为什么将NULL转换为字符串*?

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*.