我有两个类,比如说一个代表一个字符串,另一个可以转成字符串:
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;
};
现在,如果我这样做了
B x;
A y = x;
它触发复制构造函数,它编译得很好。但是如果我这样做了
A y;
y = x;
它提示分配不明确,无法在 =(A&)
和 =(char*)
之间进行选择。为什么会有差异?
最佳答案
初始化和赋值是有区别的。
在初始化时,即:
A y = x;
实际调用取决于 x
的类型。如果是同类型的y
,那么会是这样的:
A y(x);
如果不是,如您的示例所示,它将是:
A y(static_cast<const A&>(x));
这编译得很好,因为不再有歧义。
在赋值中没有这种特殊情况,所以不会自动解决歧义。
值得注意的是:
A y(x);
在您的代码中也是模棱两可的。
关于c++ - 模棱两可的赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30479923/