修改const对象的非const成员

Kol*_*nya 3 c++ const constants undefined-behavior c++11

我知道修改声明为常量的对象是一个UB.标题中提到的更复杂的例子怎么样?

class Foo
{
    public:
        Foo ( void ) { }
        int data;
};

int main ( void )
{
    const Foo foo;
    const_cast<Foo&>(foo).data = 0;   //  UB?
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

data被声明为非const,所以可以修改它.但是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?
Run Code Online (Sandbox Code Playgroud)

这是否意味着如果你设计这种类,你必须明确提到在任何情况下都没有人可以在常量实例上调用这个方法?

Mat*_*son 5

使用const_cast在修改数据const的数据结构确实是不确定的行为.例外是标记的项目mutable.这些值的重点在于,即使对象的其余部分也是可修改的const.它的确意味着"但这不是const".

由于几乎所有const都是关于编译器检测修改,尽管从技术上讲,编译器允许const在"不可写内存"中放置一些变量.该mutable关键字是出现以允许常量性的"旁路",所以编译器将不会把一个const对象到内存即不可写的,如果它有一个可变的成分,当然,也不会"对象"到const对象被修改在它的可变组件 - 甚至在const函数内部.