我知道修改声明为常量的对象是一个 UB。标题中提到的更复杂的例子呢?
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?
这是否意味着如果你设计这种类,你必须明确提到在任何情况下都不能在常量实例上调用这个方法?