对于给定的函数/代码块,是否可以将成员变量视为可变?
e.g。
class Foo() {
int blah;
void bar() const {
blah = 5; // compiler error
}
void mutable_bar() const {
blah = 5; // no compiler error
}
}
注意:在这种情况下,我不想在mutable_bar中删除const,因为逻辑const将被保留。
同样的问题,但不同的观点:我可以以某种方式将mutable关键字应用于方法而不是变量吗?
答案 0 :(得分:3)
不,至少在C ++中是不可能的。您需要mutable
或非const
功能
还有const_cast
不使用它来修改内容。如果您修改const_cast
ed const
值,则会获得未定义的行为。
7 [注意:根据对象的类型,通过指针,左值或指针进行写操作 从const_cast中导出的数据成员抛出const-qualifier73 可能会产生未定义的 行为(7.1.6.1)。 - 后注]
4除了可以修改声明为mutable(7.1.1)的任何类成员之外,任何修改const的尝试都是如此 对象在其生命周期(3.8)中导致未定义的行为 ....
5再举一个例子
struct X {
mutable int i;
int j;
};
struct Y {
X x;
Y();
};
const Y y;
y.x.i++; // well-formed: mutable member can be modified
y.x.j++; // ill-formed: const-qualified member modified
Y* p = const_cast<Y*>(&y); // cast away const-ness of y
p->x.i = 99; // well-formed: mutable member can be modified
p->x.j = 99; // undefined: modifies a const member
—end example ]
答案 1 :(得分:1)
在这种情况下,技术上可以绕过const
,例如:
void mutable_bar() const {
int& p_blah = const_cast<int&>(blah);
p_blah = 5; // no compiler error
}
或类似的构造。但是你真的在跳过篮球去做一些你不应该做的事情。正如对另一篇文章的评论所说,这是“未定义的行为”,这意味着在某些情况下它可能甚至不起作用(或做你期望它做的事情)。
答案 2 :(得分:0)
您可以使用const_cast
在所选案例中使成员not-const。这与相应的评论一起甚至可能是一个相对干净的解决方案。至少它明确表示你在限制范围内打破了const,而不是让它在世界范围内变得可变。