复制构造函数调用* this

时间:2018-01-26 01:01:44

标签: c++11 copy-constructor

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

A a = a;

我(最终)通过A::A(const A& rhs)调用this==&rhs来实现此结果。

  1. 为什么编译器允许这样做?从概念上讲,我认为由于在此声明中声明了a,因此它无法在RHS上使用。

  2. 每当我定义复制构造函数时,我是否应该防御性地检查this==&rhs

  3. 我正在使用带有-std=c++11的gcc版本5.4.0。

1 个答案:

答案 0 :(得分:1)

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

  2. 复制构造函数假设没有自我复制是正常的,将其留给调用者不会犯这个错误。最好遵循零规则。

  3. 最好不要首先写A a = a;。为避免这种情况,您可能会习惯使用auto,例如

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

    现在,如果你写G(a);,你就会默默地得到错误,但是F(a);无法编译。