英文:
Why can a const member function modify an object's mutable data member in C++11?
问题
为什么和如何可以使一个 const
成员函数修改对象的 mutable
数据成员?
成员函数使用 this
指针来修改对象的数据成员。const
成员函数的 this
指针是指向常量的指针,而不是普通的数据成员。那么为什么总是可以修改对象上标记为 mutable
的数据成员,编译器是如何实现的呢?
英文:
Why and how can a const
member function modify an object's mutable
data member?
Member functions use the this
pointer to modify the data members of an object. The this
pointer of a const
member function is a pointer to a constant, not a normal data member. So why is it always possible to modify the data members marked mutable
of an object, and how does the compiler implement it?
答案1
得分: 7
mutable
成员变量的整个目的是它们可以通过const
实例进行修改。因此,this
是const
与修改mutable
成员变量时无关,就像读取成员变量时无关一样。
英文:
The entire point of mutable
member variables is that they can be modified via a const
instance. So the fact that this
is const
has no relevance when modifying a mutable
member variable--just as it has no relevance when reading a member variable.
答案2
得分: 3
在询问编译器如何处理 mutable
之前,你应该先了解编译器如何处理 const
。
正如其名称所示,mutable
只是另一个限定符(或者更确切地说是存储类别说明符),它与 const
的处理方式有关。它表示一个 mutable
成员变量可以在声明为 const
的情况下进行修改。它也可以通过对包含对象的 const
引用(或指针)进行修改。它与成员函数没有直接关系。
请注意,mutable
成员变量不能通过直接的 const
引用(或指针)进行修改。
在考虑对符号进行变异操作时,编译器只是根据上述规则检查符号是否可以在这个上下文中进行变异。
示例:
struct S {
mutable int i;
};
int main() {
S const object{0};
object.i = 1; // 可以,因为 object.i 声明为 `mutable`,即使 object 是 `const`
S const& ref = object;
ref.i = 2; // 可以,因为 ref 引用了具有 `mutable` 成员 `i` 的对象
int const& direct_ref = object.i;
direct_ref = 3; // 错误,因为 direct_ref 直接引用了一个 `const` 符号
}
英文:
> how does the compiler implement it?
Before asking how the compiler handles mutable
, you should ask how the compiler handles const
.
As the name implies, mutable
is just another qualifier (or rather a storage class specifier) that interacts with how const
is handled. It simply means that a mutable
member variable can be modified, even if the containing object is declared const
. It can also be modified through a const
reference (or pointer) to the containing object. It does not directly relate to member functions.
Note that a mutable
member variable cannot be modifier through a direct const
reference (or pointer).
When looking at a mutating operation on a symbol, the compiler simply checks whether the symbol can be mutated in this context according to the rules above.
struct S {
mutable int i;
};
int main() {
S const object{0};
object.i = 1; // ok because object.i is qualified `mutable`, even if object is `const`
S const& ref = object;
ref.i = 2; // ok because ref refers to an object that has a `mutable` member `i`
int const& direct_ref = object.i;
direct_ref = 3; // error because direct_ref directly refers to a `const` symbol
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论