2017-07-20 135 views
3

我没有在SO上找到与mutable const相关的任何主题。我已经将代码减少到最小工作代码(在Visual Studio上)。如果我们取消注释//*data = 11;,编译器会抱怨const_ness。我想知道mutable const是如何工作的。什么是可变常量?

class A 
{ 
public: 

    void func(int & a) const 
    { 
     pdata = &a; 
     //*pdata = 11; 
    } 

    mutable const int * pdata; 
}; 

int main() 
{ 
    const A obj; 

    int a = 10; 
    obj.func(a); 
} 
+0

这段代码看起来很像废话...... – deviantfan

+0

我缺乏在示例中加入更多意义的能力。 –

+0

[这会更有趣一个例子。](http://ideone.com/g2ACsP)注意我们如何修改const对象中的成员。 – user4581301

回答

2

mutable const听起来像一个矛盾,但它实际上有一个非常合理的解释。 const int *意味着指向整数值不能通过该指针进行更改。 mutable表示指针本身可以更改为指向另一个int对象,即使pdata成员所属的对象本身也是const。同样,指向的值不能通过该指针改变,但该指针本身可以被重新设置。

由于该分配违反了您的承诺,不修改指向的值(const int *部分),所以您的代码在赋值语句未注释时失败。

+2

我认为mutable只是意味着“非常量”。即使对象是const。听起来像你在谈论挥发性而不是可变的。马特的回答听起来更像我期待的。 – xaxxon

+0

对不起......你说得对。脑屁。现在编辑 - 待命。 –

6

这个例子有点令人困惑,因为mutable关键字不是类型说明符const int *的一部分。它解析像像static存储类,这样的声明:

mutable const int *pdata; 

pdata是一个可变指向一个const int的。

由于指针是可变的,所以它可以在const方法中修改。它指向的值是const,并且不能通过该指针进行修改。

+0

这很奇怪;我会认为这看起来像'const int * mutable pdata;'但我想这是有道理的 – Justin

4

您在理解mutable const类成员无意义时是正确的。你的例子更多地展示了const如何与指针一起工作的怪癖。

请考虑以下类。

class A { 
    const int * x; // x is non-const. *x is const. 
    int const * y; // y is non-const. *y is const. 
    int * const z; // z is const. *z is non-const. 
}; 

因此const具有不同的含义,具体取决于你写的地方。

由于xy是非常量,所以使它们不可变是不矛盾的。

class A { 
    mutable const int * x; // OK 
    mutable int const * y; // OK 
    mutable int * const z; // Doesn't make sense 
};