考虑下面的示例代码:
class A
{
public:
A() : n(0) {}
int n;
};
class B
{
public:
B(A* a) : mA(a) { }
B(const A* a) : mConstA(a) { }
union {
A* mA;
const A* mConstA;
};
};
int main()
{
A a;
B b1(&a);
B b2(const_cast<const A*>(&a));
return 0;
}
在构造时,b1
会有一个指向 的可变指针a
,而b2
将有一个指向 的不可变指针a
。在这种情况下,b1.mA
equalsb2.mConstA
和b1.mConstA
equals b2.mA
。
当你有一个const
和非const
对象指针的并集时,这些等式是否总是正确的?
同样,下面的代码编译/运行良好:
int main()
{
const A a;
B b(&a);
b.mA->n = 3; // Blasphemy!!!
return 0;
}
但它是否保证b.mA
永远等于b.mConstA
?