2013-04-27 129 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 
} 

或一些類似的結構。但是你真的非常忙於做一些你不應該做的事情。正如對另一篇文章的評論所說,這是「未定義的行爲」,這意味着在某些情況下它甚至可能不工作(或者做你期望的工作)。