我知道修改声明为常量的对象是UB。标题中提到的更复杂的例子呢?修改const对象的非const成员
class Foo
{
public:
Foo (void) { }
int data;
};
int main (void)
{
const Foo foo;
const_cast<Foo&>(foo).data = 0; // UB?
return 0;
}
data
被声明为非常量因此可以修改它。但foo
被声明为const。所以我们似乎无法修改它。因此我相信UB在这里被调用。我对吗?
更新:所以它出来,它实际上是一个UB。这意味着所有具有修改可变成员的假常量成员的类在常量实例上产生UB。
class Foo
{
public:
mutable int data;
Foo (void) { }
void foo (void) const
{
some_modifications_of_data();
}
};
const Foo foo;
foo.foo(); // UB?
这是否意味着,如果你设计这样的类必须明确提到,在任何情况下,没有人可以调用此方法在恒定的实例?
不,对象是const,所以你不能修改它。 – chris
是的,它是由标准的,未定义的。它可能在你的特定编译器中“工作”(因为在你设定的数据中为零),因为该选项是“未定义行为”的可能结果之一。 –
@chris:'const_cast'确实摆脱了'const',所以编译器会编译这个,生成一些代码,可能实际上可能“不工作”。 –