C++ 常量/非常量对象指针的并集
考虑下面的示例代码:C++ 常量/非常量对象指针的并集,c++,constants,C++,Constants,考虑下面的示例代码: 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);
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;
}
但是是否保证b.mA
始终等于b.mConstA
当你有常量和非常量成员的联合时,这些等式总是正确的吗
是的,两个指针将引用同一地址中的同一对象。内存中的位将是相同的
但b.mA是否保证始终等于b.mConstA
是的,它们的值是相同的,但这并不意味着您可以真正使用它。这相当于使用
const\u cast
,您将获得指向该对象的非常量指针,但如果该对象确实是const
,则使用该指针修改该对象是未定义的行为。请注意,这些不是常量/非常量变量,而是指向常量/非常量对象的非常量指针。@DavidRodríguez dribeas,你是对的。固定的。:)
int main()
{
const A a;
B b(&a);
b.mA->n = 3; // Blasphemy!!!
return 0;
}