0

是否可以让成员变量仅对给定的函数/代码块被认为是可变的?

例如

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

4

3 回答 3

3

不,这是不可能的,至少在 C++ 中是不可能的。您需要mutable或非const功能。
还有const_cast不要用它来修改东西。如果您修改const_castedconst值,您会得到未定义的行为。

5.2.11 常量转换

7 [注意:根据对象的类型,通过指针、左值或指向数据成员的指针的写操作由丢弃 const-qualifier73 的 const_cast 产生,可能会产生未定义的行为(7.1.6.1)。——尾注]

7.1.6.1 cv 限定符

4 除了可以修改任何声明为可变的类成员(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 ]
于 2013-04-27T19:32:37.920 回答
1

在这种情况下,技术上可以绕过const,例如:

void mutable_bar() const {
    int& p_blah = const_cast<int&>(blah);

    p_blah = 5; // no compiler error
}

或一些类似的构造。但是你真的是在做一些你不应该做的事情。正如另一篇文章的评论所说,这是“未定义的行为”,这意味着在某些情况下它甚至可能不起作用(或者做你期望它做的事情)。

于 2013-04-27T19:36:54.783 回答
0

在选定的情况下,您可以使用 aconst_cast使成员非 const。这与相应的评论一起,甚至可能是一个相对干净的解决方案。至少它是明确的,你在一个受限的范围内打破了 const,而不是让它在世界范围内是可变的。

于 2013-04-27T19:34:09.930 回答