我在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 :(得分: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
具有不同的含义,具体取决于您编写它的位置。
由于x
和y
是非常规的,因此在使它们变为可变方面没有矛盾。
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 *
部分)的承诺。