我为类A
定义了一个复制构造函数。由于不幸的宏扩展,我最终编译了以下内容:
A a = a;
我(最终)通过A::A(const A& rhs)
调用this==&rhs
来实现此结果。
为什么编译器允许这样做?从概念上讲,我认为由于在此声明中声明了a
,因此它无法在RHS上使用。
每当我定义复制构造函数时,我是否应该防御性地检查this==&rhs
?
我正在使用带有-std=c++11
的gcc版本5.4.0。
答案 0 :(得分:1)
在声明中,声明的标识符一出现就在范围内。这有一些有效的用途,例如void *p = &p;
复制构造函数假设没有自我复制是正常的,将其留给调用者不会犯这个错误。最好遵循零规则。
最好不要首先写A a = a;
。为避免这种情况,您可能会习惯使用auto
,例如
#define F(x) auto a = A(x)
#define G(x) A a = x
现在,如果你写G(a);
,你就会默默地得到错误,但是F(a);
无法编译。