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;
但是在开头给出的例子中,d
和this
指向的是同一个对象。换句话说,名称 d
和 *this
是同一对象的别名。不允许使用其他别名 d
访问 class 的 non-static 数据成员,因为 d
不是从 this
获得的.或者更准确地说,未指定此类访问将读取什么值。所以 b(d.a)
可能会也可能不会将 b
成员初始化为与 a
.
相同的值
参见 [class.cdtor]/2。
我正在学习 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;
但是在开头给出的例子中,d
和this
指向的是同一个对象。换句话说,名称 d
和 *this
是同一对象的别名。不允许使用其他别名 d
访问 class 的 non-static 数据成员,因为 d
不是从 this
获得的.或者更准确地说,未指定此类访问将读取什么值。所以 b(d.a)
可能会也可能不会将 b
成员初始化为与 a
.
参见 [class.cdtor]/2。