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,而b2将有一个指向 的不可变指针a。在这种情况下,b1.mAequalsb2.mConstAb1.mConstAequals b2.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

2

当您拥有 const 和非 const 成员的联合时,这些等式是否总是正确的?

是的,两个指针都指向同一个地址中的同一个对象。内存中的位将是相同的。

但是是否保证 b.mA 始终等于 b.mConstA?

是的,它们的值将是相同的,但这并不意味着您可以真正使用它。这相当于 using const_cast,你会得到一个指向对象的非常量指针,但如果对象真的是const,使用那个指针来修改对象是未定义的行为。

于 2013-08-05T16:42:22.577 回答