2013-04-27 128 views
0

对于给定的函数/代码块,是否可以让一个成员变量仅被认为是可变的?成员变量的临时可变性

例如

class Foo() { 
    int blah; 
    void bar() const { 
    blah = 5; // compiler error 
    } 
    void mutable_bar() const { 
    blah = 5; // no compiler error 
    } 
} 

注:在这种情况下,我不希望在mutable_bar摆脱常量,因为逻辑常量将被保留。

同样的问题,但不同的观点:我可以以某种方式将可变关键字应用于方法而不是变量?

+0

我认为你可以做'const_cast (this) - > blah = 5;'。你需要什么? – Elazar 2013-04-27 19:33:13

+2

@Elazar:如果对象实际上首先声明为“const”,则这是UB。 *不要这样做!* – syam 2013-04-27 19:33:58

+0

@syam在这里声明了什么'const',究竟是什么? – lapk 2013-04-27 19:37:37

回答

3

不,至少在C++中是不可能的。您需要mutable或非const函数。
也有const_cast不要用它来修改东西。如果您修改const_cast ed const值,您将收到未定义的行为。

5.2.11 CONST投

7 [注:根据不同的对象,通过指针,左值或指针 数据成员从该转换丢失了一个const const_cast类型转换造成的写操作的类型 - 限定符73 可能产生未定义的 行为(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 ] 
+0

“**可能会产生未定义的行为”究竟意味着什么? – 2013-04-27 19:40:04

+0

感谢您的报价。现在,这取决于“对象的类型”?如果对象是const,那么它就是UB,如果不是,它不是。对不起,你还需要阅读其余的内容。 – 2013-04-27 19:41:18

+0

@PaulManta这意味着事情*可能*出错,可能不会。编写我的代码时,我不想做下注。 – alexrider 2013-04-27 19:44:47

0

你可以使用一个const_cast使成员没有const的在选定的情况下。这与相应的评论一起,甚至可能是一个相对干净的解决方案。至少它明确表示你将const限制在一个有限的范围内,而不是让它在全局范围内变化。

+0

修改const_cast的值是UB – alexrider 2013-04-27 19:35:07

+0

谢谢你重复说明它不一定是UB,syam。我不完全同意“不要这样做!”尽管如此,我仍然相信软件开发人员可以做出明智的决定。 – 2013-04-27 19:37:05

+0

@doomster:对不起,我在看到alexrider的时候删除了我的评论。 ;)然而,就我**而言,我支持我的“*不要这样做”,因为UB非常危险。 YMMV当然。 :) – syam 2013-04-27 19:41:55

1

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

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

    p_blah = 5; // no compiler error 
} 

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