模糊赋值运算符

riv*_*riv 12 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;
};
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*).为什么不同?

rod*_*igo 5

初始化和分配之间存在差异.

在初始化中,即:

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)

您的代码中也含糊不清.

  • 值得指出的是,本说明书中有一些简化.例如,`static_cast`实际上是一个隐式转换,它不允许显式转换函数. (3认同)