在 *this 上调用的复制构造函数

Copy constructor called on *this

我为 class A 定义了一个复制构造函数。由于不幸的宏扩展,我最终编译了以下内容:

A a = a;

我(最终)意识到这会导致使用 this==&rhs 调用 A::A(const A& rhs)

  1. 为什么编译器允许这样做?从概念上讲,我会假设因为 a 是在这个声明中声明的,所以它还不能在 RHS 上使用。

  2. 我是否应该在定义复制构造函数时进行防御性检查this==&rhs

我正在使用 gcc 5.4.0 版 -std=c++11

  1. 在声明中,被声明的标识符一出现就在范围内。这有一些有效的用途,例如void *p = &p;

  2. copy-constructor假设没有self-copy是正常的,让调用者不要犯这个错误。最好遵循零的规则。

一开始就不要写A a = a;比较好。为避免这种情况,您可以养成使用 auto 的习惯,例如

#define F(x) auto a = A(x)

#define G(x) A a = x

现在,如果您编写 G(a);,您会默默地发现错误,但 F(a); 无法编译。