什么是可变常量?

问题描述 投票:0回答:3

我在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);
}
c++ pointers constants mutable
3个回答
9
投票

这个示例有点令人困惑,因为

mutable
关键字不是类型说明符
const int *
的一部分。它被解析为像
static
这样的存储类,因此声明:

mutable const int *pdata;

表示

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

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


6
投票

您对

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
};

3
投票

mutable const
听起来像是一个矛盾修辞法,但它实际上有一个完全合理的解释。
const int *
意味着不能通过该指针更改所指向的整数值。
mutable
意味着指针本身可以更改为指向另一个 int 对象,即使
A
成员所属的
pdata
对象本身是 const。 同样,无法通过该指针更改指向的值,但该指针本身可以重新定位。

当赋值语句未注释时,您的代码会失败,因为该赋值违反了您不修改指向值的承诺(

const int *
部分)。

© www.soinside.com 2019 - 2024. All rights reserved.