this 指针不能在构造函数中使用别名:

this pointer cannot be aliased in a constructor:

我正在学习 C++ 中的继承。我遇到了以下 statement:

In other words, the this pointer cannot be aliased in a constructor:

extern struct D d;
struct D
{
    D(int a) : a(a), b(d.a) {} // b(a) or b(this->a) would be correct
    int a, b;
};
D d = D(1);   // because b(d.a) did not obtain a through this, d.b is now unspecified

以上例子来自cppreference.

我的第一个问题是写着“this不能在一个ctor中使用别名”但是在上面的例子中,他们写在评论“b(this->a) 是正确的”。这对我来说似乎是矛盾的,因为当他们说 this 不能在 ctor 中使用别名时,我理解“this 不能在 ctor 中 使用 ” .但是,如果 this 不能在 ctor 中 used/aliased,那么他们为什么说写 b(this->a) 是正确的。初始化列表不被认为是“在构造函数中”吗?


现在让我们看一个自定义示例:

struct Name 
{
    private: 
        int x = 0;
  Name(int n )
  {
     this->x = 4;  //is the use of "this" well-defined here?
  }
};

我的第二个问题是上面显示的转换构造函数中表达式this->x的使用是否定义明确?我的意思是因为根据我问题开头的引述 this 不能在 ctor 中使用别名,所以这不应该是有效的。

意思是在 class 对象的构造期间,对对象 non-static 数据成员的任何访问都应该通过直接或间接从 [=12 获得的 pointer/glvalue 进行=] 的构造函数。否则,这种访问读取的值是未指定的。

所以 this->a 总是好的,就像 a 一样,它隐含地与 this->a.

相同

也可以复制指针this并通过它访问成员,例如

auto p = this;
b = p->a;

或存储对对象的引用:

auto& r = *this;
b = r.a;

但是在开头给出的例子中,dthis指向的是同一个对象。换句话说,名称 d*this 是同一对象的别名。不允许使用其他别名 d 访问 class 的 non-static 数据成员,因为 d 不是从 this 获得的.或者更准确地说,未指定此类访问将读取什么值。所以 b(d.a) 可能会也可能不会将 b 成员初始化为与 a.

相同的值

参见 [class.cdtor]/2