以下のサンプル コードを検討してください。
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ます。このシナリオでは、 equalsとequals .b2ab1.mAb2.mConstAb1.mConstAb2.mA
constおよび非constオブジェクト ポインターの結合がある場合、これらの等式は常に真ですか?
同様に、以下のコードは正常にコンパイル/実行されます。
int main()
{
const A a;
B b(&a);
b.mA->n = 3; // Blasphemy!!!
return 0;
}
b.mAしかし、 が常に と等しいことが保証されていb.mConstAますか?