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)
他们保证是真的吗?(在我检查过的几个案例中,它们似乎都是真的.)
编辑:我错过了&符号,现在这是不正当的正确形式.
从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是不是一个指针,并没有被单独分配的内存,您已发布的公式把握好至少平凡的可复制的对象.