标准定义的指针比较基本上来自 [expr.eq#3]
否则,如果指针都为空,都指向同一个函数,或者都表示相同的地址,则它们比较相等。
表示相同的地址意味着来自 [basic.compound#def:represents_the_address]
指向或超过对象末尾的指针类型的值表示object34占用的内存中第一个字节([intro.memory])的地址或存储结束后的内存中第一个字节的地址分别被物体占据
所以这实际上与地址有关,但如果是这样,那么为什么这段代码不会失败,因为技术上d_ptr和b_ptr指向具有不同地址的对象?这看起来像是关于对象,而不是地址,因为编译器可以找出 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!
Run Code Online (Sandbox Code Playgroud)