一个变量声明创建多个实例

One variable declaration creates multiple instances

本文关键字:创建 声明 实例 一个 变量      更新时间:2023-10-16

这里有一个简单的例子:

class A {
public:
  A() {
    printf("%p C1n", this);
  } 
  A(const char* p) {
    printf("%p C2n", this);
  }
};
int main(int argc, char *argv[]) {
  A a;
  a = "abc";
}

在代码中,尽管A只声明一次,但有两个A实例正在创建。构造函数被调用两次。我可以在VS 2013以及GNU C++中重现这一点。

想知道此行为是错误还是规范的一部分。

它是规范的一部分。执行此操作时:

a = "abc";

使用 A(const char* p) 构造函数从 RHS 上的"abc"表达式创建一个临时A对象。这用于为 a 赋值。

如果你这样做

A a = "abc";

您只会看到一个构造函数调用。

因为您尚未禁用自动生成的赋值运算符或复制构造函数,所以您的类实际上对编译器如下所示:

class A {
public:
  A() {
    printf("%p C1n", this);
  }
  A(const A& rhs) { }
  A(const char* p) {
    printf("%p C2n", this);
  }
  A& operator=(const A& rhs) { return *this; }
};

所以a = "abc"被解释为a.operator=( A("abc") )

它期望一个const A&作为operator=的参数,它可以构造它,因为你提供了一个构造函数A(const char*)

可以通过显式构造函数来防止意外转换。

class A {
public:
  A() {
    printf("%p C1n", this);
  }
  explicit A(const char* p) {
    printf("%p C2n", this);
  }
};

那么这应该无法编译:

int main(int argc, char *argv[]) {
  A a;
  a = "abc";
}

除非您显式构造:a = A("abc");

相关文章: