我在SO上没有找到任何与
mutable const
相关的主题。 我已将代码减少到最少的工作代码(在 Visual Studio 上)。如果我们取消注释 //*pdata = 11;
,编译器会抱怨常量性。我想知道 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);
}
这个示例有点令人困惑,因为
mutable
关键字不是类型说明符 const int *
的一部分。它被解析为像static
这样的存储类,因此声明:
mutable const int *pdata;
表示
pdata
是指向 const int 的可变指针。
由于指针是可变的,因此可以在 const 方法中对其进行修改。 它指向的值是const,不能通过该指针修改。
您对
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
};
mutable const
听起来像是一个矛盾修辞法,但它实际上有一个完全合理的解释。 const int *
意味着不能通过该指针更改所指向的整数值。 mutable
意味着指针本身可以更改为指向另一个 int 对象,即使 A
成员所属的 pdata
对象本身是 const。 同样,无法通过该指针更改指向的值,但该指针本身可以重新定位。
当赋值语句未注释时,您的代码会失败,因为该赋值违反了您不修改指向值的承诺(
const int *
部分)。