c++11
引入mutable
關鍵字,它是乙個型別修飾符,用來修飾成員變數或者是lambda
函式,接下來分布來說明。
當mutable
用來修飾成員變數時,表明該成員變數屬於物件內部可變
狀態,對外不可見。即使在const
函式也可改變,不影響外部使用者對此const
函式的邏輯語義。比如,基於mutex
的執行緒安全佇列。
class queue
private:
// 一定要加`mutable`修飾,否則會編譯出錯。
mutable std::mutex mutex_;
};
在上述例子中,empty
函式用來判斷當前佇列是否為空,從語義上看,該函式不會改變佇列內部元素個數,加上const
修飾,向編譯器明確明該語義。由於內部訪問了佇列,因此需要加鎖,加鎖這個動作會改變鎖狀態,這和const
的語義有衝突,不增加mutable
修飾該鎖變數,會編譯失敗,因此標準引入mutable
修飾符,宣告該變數是始終可修改的。
當它用來修飾lambda
函式時,可在lambda
函式體內修改外部的拷貝入參,例項如下:
int x;
auto f1 = [x]() mutable;
auto f2 = [x]() ; // 編譯出錯
auto f3 = [&x]() ; // 編譯通過
編譯f2
會觸發編譯錯誤,提示無法在非可變lambda中修改通過複製捕獲
。對此函式加上mutable
,使得該匿名函式支援修改拷貝入參。
注意,通過拷貝傳參時,lambda
函式內部對該引數的修改不會影響外部值。如果是傳引用,可不加mutable
。
c 關鍵字mutable深入解析
1 關於mutable關鍵字 先說用法,mutable關鍵字只能修飾非靜態以及非常量成員變數,使用muwww.cppcns.comtable修www.cppcns.com飾的成員變數在const函式中的值是可以修改的。比如說下面的 複製 如下 class de程式設計客棧mo demo public...
關鍵字mutable小議
關鍵字mutable小議 內容 我們知道在用const修飾的類成員函式,這意味著什麼,從effective c 這本書上我們可以了解到,這裡存在兩個流行的概念 bitwise constness or physical constness 和logical constness.bitwise con...
深入解析C 中的mutable關鍵字
在c 中,mutable也是為了突破const的限制而設定的。被mutable修飾的變數,將永遠處於可變的狀態,即使在乙個const函式中 mutalbe的中文意思是 可變的,易變的 跟constant 既c 中的const 是反義詞。在c 中,mutable也是為了突破const的限制而設定的。被...