2017-07-20 172 views
3

我沒有在SO上找到與mutable const相關的任何主題。我已經將代碼減少到最小工作代碼(在Visual Studio上)。如果我們取消註釋//*data = 11;,編譯器會抱怨const_ness。我想知道mutable const是如何工作的。什麼是可變常量?

class A 
{ 
public: 

    void func(int & a) const 
    { 
     pdata = &a; 
     //*pdata = 11; 
    } 

    mutable const int * pdata; 
}; 

int main() 
{ 
    const A obj; 

    int a = 10; 
    obj.func(a); 
} 
+0

這段代碼看起來很像廢話...... – deviantfan

+0

我缺乏在示例中加入更多意義的能力。 –

+0

[這會更有趣一個例子。](http://ideone.com/g2ACsP)注意我們如何修改const對象中的成員。 – user4581301

回答

2

mutable const聽起來像一個矛盾,但它實際上有一個非常合理的解釋。 const int *意味着指向整數值不能通過該指針進行更改。 mutable表示指針本身可以更改爲指向另一個int對象,即使pdata成員所屬的對象本身也是const。同樣,指向的值不能通過該指針改變,但該指針本身可以被重新設置。

由於該分配違反了您的承諾,不修改指向的值(const int *部分),所以您的代碼在賦值語句未註釋時失敗。

+2

我認爲mutable只是意味着「非常量」。即使對象是const。聽起來像你在談論揮發性而不是可變的。馬特的回答聽起來更像我期待的。 – xaxxon

+0

對不起......你說得對。腦屁。現在編輯 - 待命。 –

6

這個例子有點令人困惑,因爲mutable關鍵字不是類型說明符const int *的一部分。它解析像像static存儲類,這樣的聲明:

mutable const int *pdata; 

pdata是一個可變指向一個const int的。

由於指針是可變的,所以它可以在const方法中修改。它指向的值是const,並且不能通過該指針進行修改。

+0

這很奇怪;我會認爲這看起來像'const int * mutable pdata;'但我想這是有道理的 – Justin

4

您在理解mutable const類成員無意義時是正確的。你的例子更多地展示了const如何與指針一起工作的怪癖。

請考慮以下類。

class A { 
    const int * x; // x is non-const. *x is const. 
    int const * y; // y is non-const. *y is const. 
    int * const z; // z is const. *z is non-const. 
}; 

因此const具有不同的含義,具體取決於你寫的地方。

由於xy是非常量,所以使它們不可變是不矛盾的。

class A { 
    mutable const int * x; // OK 
    mutable int const * y; // OK 
    mutable int * const z; // Doesn't make sense 
};