我有两个类,其中一个代表一个字符串,另一个可以转换为字符串:
class A {
public:
A() {}
A(const A&) {}
A(const char*) {}
A& operator=(const A&) { return *this; }
A& operator=(const char*) { return *this; }
char* c;
};
class B {
public:
operator const A&() const {
return a;
}
operator const char*() const {
return a.c;
}
A a;
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我这样做
B x;
A y = x;
Run Code Online (Sandbox Code Playgroud)
它触发复制构造函数,编译很好.但如果我这样做
A y;
y = x;
Run Code Online (Sandbox Code Playgroud)
它抱怨模糊的任务,不能在=(A&)和之间做出选择=(char*).为什么不同?
初始化和分配之间存在差异.
在初始化中,即:
A y = x;
Run Code Online (Sandbox Code Playgroud)
实际调用取决于类型x.如果它是相同的类型y,那么它将是:
A y(x);
Run Code Online (Sandbox Code Playgroud)
如果没有,就像在你的例子中一样,它将是:
A y(static_cast<const A&>(x));
Run Code Online (Sandbox Code Playgroud)
编译得很好,因为不再有歧义.
在赋值中没有这种特殊情况,因此没有自动解决歧义.
值得一提的是:
A y(x);
Run Code Online (Sandbox Code Playgroud)
您的代码中也含糊不清.