C++ 为什么可变说明符被分类为存储类说明符,而不是限定符?

C++ 为什么可变说明符被分类为存储类说明符,而不是限定符?,c++,language-lawyer,language-design,mutable,storage-class-specifier,C++,Language Lawyer,Language Design,Mutable,Storage Class Specifier,当在非静态数据成员的声明中使用mutable说明符时,无论对象的其余部分是否被视为常量,数据都是可变的。有了这个事实,我们可能很容易产生这样的印象:mutable说明符与const限定符是同一种东西,但事实证明不是这样。事实上,该语言将mutable说明符分类为存储类说明符。这与直觉相反,因为mutable没有指定存储持续时间 这个设计决策背后的理由是什么 如果mutable是一个限定符,那么它的逻辑性会比看上去的低多少呢 使其成为存储类说明符有什么好处?cv限定符修改/限制对象的语义可变不可用

当在非静态数据成员的声明中使用
mutable
说明符时,无论对象的其余部分是否被视为常量,数据都是可变的。有了这个事实,我们可能很容易产生这样的印象:
mutable
说明符与
const
限定符是同一种东西,但事实证明不是这样。事实上,该语言将
mutable
说明符分类为存储类说明符。这与直觉相反,因为
mutable
没有指定存储持续时间

这个设计决策背后的理由是什么

如果
mutable
是一个限定符,那么它的逻辑性会比看上去的低多少呢

使其成为存储类说明符有什么好处?

cv限定符修改/限制对象的语义<代码>可变不可用。在几乎所有的场景中,作为类型的一部分是多余的,同时需要更多关于指针转换等的段落


因此,决定将其设置为不是类型说明符的decl说明符。由于
const
会导致对象被放入写保护内存,
mutable
会导致对象不被放入这样的内存,这表明它是一个存储类说明符。

您的问题在[dcl.stc]中得到了直接回答N4140的:
类数据成员上的可变说明符使应用于包含类对象的常量说明符无效,并允许修改可变类成员,即使对象的其余部分是常量(7.1.6.1)。
常量和
volatile
都是该类型的一部分
mutable
不是。实现允许将常量对象放在只读内存中,但显然不允许将可变成员放在只读内存中。因此,如果您稍微看一看,它与存储并非完全无关。@user6292850不,它不是,完全不是。
const
在类型中存在间接寻址时对每个“级别”应用不同,但
mutable
始终是“顶级”。允许
可变int*p是很好的
而不需要
int*可变p
我假设一个假设的
mutable int C::*
(其中
mutable
是指向的类型的一部分)可以通过成员语法指针来更改
const C
对象的mutable
int
子对象,但肯定成本远远大于收益。