什么是可变的const?

时间:2017-07-20 03:47:16

标签: c++ pointers const mutable

我在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);
}

3 个答案:

答案 0 :(得分:6)

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

mutable const int *pdata;

表示pdata是指向const int的可变指针。

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

答案 1 :(得分: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
};

答案 2 :(得分:2)

mutable const听起来像是矛盾,但实际上却有一个非常明智的解释。 const int *表示无法通过该指针更改指向的整数值。 mutable表示指针本身可以更改为指向另一个int对象,即使A成员所属的pdata对象本身为const。同样,指向的值不能通过该指针改变,但指针本身可以重新安装。

当取消赋值语句时,您的代码失败,因为该赋值违反了您不修改指向值(const int *部分)的承诺。