修改const对象的可变成员是否有效?

时间:2014-07-24 19:26:45

标签: c++ const mutable

在C ++中,您现在可以拥有mutable个成员。这增加了一层"逻辑const"对语言。这些如何与只读数据相关 - 将mutable成员阻止将const类放入.rodata部分?

class Foo {
    mutable int bar;

public:
    Foo(): bar(0) {}
    void set(int x) const { bar = x; }
};

// Can this be in a read-only section?
const Foo foo;

int main(void)
{
    // Is this well-defined?
    foo.set(5);
}

2 个答案:

答案 0 :(得分:5)

是的,您可以修改const对象的可变成员,这在draft C++ standard部分7.1.1 存储类说明符中有所说明:

  

类数据成员上的可变说明符使const无效   说明符应用于包含类对象和许可   修改了可变类成员,即使其余部分也是如此   object是const(7.1.6.1)。

Technical Report on C++ Performance 部分7.1 ROMability 涵盖了编译器可以将数据放入只读内存的情况。在这种情况下,这是不可能的,因为它显然不是一成不变的:

  因此,ROMability的主题对所有人都有性能应用   程序,其中程序的不可变部分可以放在一个   共享的只读空间。

答案 1 :(得分:2)

mutable成员可以在const方法中修改,并且很可能会删除该对象ROMability。还有其他要求使类ROMable的实例。有关详细信息,请参阅Techincal Report on C++ Perfomance第7章和here