成员变量的临时可变性

时间:2013-04-27 19:30:23

标签: c++ mutable

对于给定的函数/代码块,是否可以将成员变量视为可变?

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关键字应用于方法而不是变量吗?

3 个答案:

答案 0 :(得分:3)

不,至少在C ++中是不可能的。您需要mutable或非const功能 还有const_cast不使用它来修改内容。如果您修改const_cast ed const值,则会获得未定义的行为。

5.2.11 Const cast

  

7 [注意:根据对象的类型,通过指针,左值或指针进行写操作   从const_cast中导出的数据成员抛出const-qualifier73 可能会产生未定义的   行为(7.1.6.1)。 - 后注]

7.1.6.1 cv-qualifiers

  

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,而不是让它在世界范围内变得可变。