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