c++ - 模棱两可的赋值运算符

标签 c++

我有两个类,比如说一个代表一个字符串,另一个可以转成字符串:

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/

相关文章:

作为 Objective-C++ 属性的 C++ 对象

c++ - 使用智能指针继承的 pimpl

c++ - 如何播种 randn 函数 opencv

c++ - 谷歌微基准测试 cpu 缩放警告

c++ - 未找到 dyld 符号,但 nm 以其他方式报告(OS X 更新问题)

c++ - 类中成员声明顺序如果相互依赖,最优解

c++ - 使用集合计算素数,C++

c++ - 常量输入与非常量输出

C++ 转换器脚本

hostname - 写一个C++代码来获取主机名