数据成员地址是否位于(this)和(this + 1)之间?

use*_*819 7 c++ language-lawyer

假设我们在成员函数中有以下两个不等式

this <=  (void *) &this->data_member
Run Code Online (Sandbox Code Playgroud)

&this->data_member < (void *) (this+1) 
Run Code Online (Sandbox Code Playgroud)

他们保证是真的吗?(在我检查过的几个案例中,它们似乎都是真的.)

编辑:我错过了&符号,现在这是不正当的正确形式.

P.W*_*P.W 5

从CPP标准草案4713:

6.6.2对象模型[intro.object]/7
平凡可复制或标准布局类型(6.7)的对象应占用连续的存储字节.

12.2类成员[class.mem]/18
分配具有相同访问控制(第14章)的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址.

12.2类成员[class.mem]/25
如果标准布局类对象具有任何非静态数据成员,则其地址与其第一个非静态数据成员的地址相同.否则,其地址与其第一个基类子对象(如果有)的地址相同.

综合以上所有内容,我们可以说第一个等式至少适用于可复制的对象.

也来自在线cpp参考:

比较两个指向对象的指针(转换后)的结果定义如下:

1)如果两个指针指向同一个数组的不同元素,或者指向同一个数组的不同元素中的子对象,则指向具有较高下标的元素的指针会比较大.换句话说,它们比较指针的结果与它们指向的元素的索引的比较结果相同.
2)如果一个指针指向一个数组的元素,或指向该数组元素的一个子对象,另一个指针指向一个超过该数组的最后一个元素的指针,后一个指针则指向更大的指针.指向单个对象的指针被视为指向一个数组的指针:&obj+1比较大于&obj(自C++ 17以来)

所以,如果你data_member不是一个指针,并没有被单独分配的内存,您已发布的公式把握好至少平凡的可复制的对象.

  • @ PeterA.Schneider - 这个表达式的布尔结果未被标准指定,我不知道你对"正确"的定义是什么,我的接近这一点从标准是否为我们提供了解释它的规范开始.如果我们无法以真正便携的方式对其进行推理,那么讨论"正确性"毫无意义. (2认同)