2

以下のサンプル コードを検討してください。

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ますか?

4

1 に答える 1