在 *this 上调用的复制构造函数
Copy constructor called on *this
我为 class A
定义了一个复制构造函数。由于不幸的宏扩展,我最终编译了以下内容:
A a = a;
我(最终)意识到这会导致使用 this==&rhs
调用 A::A(const A& rhs)
。
为什么编译器允许这样做?从概念上讲,我会假设因为 a
是在这个声明中声明的,所以它还不能在 RHS 上使用。
我是否应该在定义复制构造函数时进行防御性检查this==&rhs
?
我正在使用 gcc 5.4.0 版 -std=c++11
。
在声明中,被声明的标识符一出现就在范围内。这有一些有效的用途,例如void *p = &p;
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);
无法编译。
我为 class A
定义了一个复制构造函数。由于不幸的宏扩展,我最终编译了以下内容:
A a = a;
我(最终)意识到这会导致使用 this==&rhs
调用 A::A(const A& rhs)
。
为什么编译器允许这样做?从概念上讲,我会假设因为
a
是在这个声明中声明的,所以它还不能在 RHS 上使用。我是否应该在定义复制构造函数时进行防御性检查
this==&rhs
?
我正在使用 gcc 5.4.0 版 -std=c++11
。
在声明中,被声明的标识符一出现就在范围内。这有一些有效的用途,例如
void *p = &p;
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);
无法编译。