C++ 指针比较在标准中定义错误

问题描述 投票:0回答:1

标准定义了这样的指针比较,基本上来自[expr.eq#3]

否则,如果指针都为空,都指向同一个函数,或者都代表相同的地址,则它们比较相等。

表示相同的地址意味着来自 [basic.compound#def:represents_the_address]

指针类型的值是指向或超过对象末尾的指针,表示该 object34 占用的内存中第一个字节([intro.memory])的地址或该对象末尾之后的内存中第一个字节的地址。对象分别占用的存储空间

所以这实际上与地址有关,但如果是这样,那么为什么这段代码在技术上不会失败,因为d_ptrb_ptr指向具有不同地址的对象?这看起来像是关于 objects,而不是 addresses,因为编译器可以找出 d_ptr 和 b_ptr 最后都指向同一个完整对象!

struct B { int a;};
struct B1 { int b; };
struct D : B, B1 {};
struct A {};
....
D obj;
D *d_ptr = &obj;
B1 *b_ptr = d_ptr;
assert(d_ptr == b_ptr);//should have failed as d_ptr and b_ptr point to objects with diffrent addresses!
c++ object pointers language-lawyer
1个回答
0
投票

你错过了这段文字

如果至少一个操作数是指针,则对两个操作数执行指针转换、函数指针转换和限定转换,以将它们转换为复合指针类型。

指针转换可以更改指针表示的地址,这正是您的情况所发生的情况。

© www.soinside.com 2019 - 2024. All rights reserved.