2013-01-08 98 views
3

看完後You don't know const and mutable我有點困惑,以後如何正確處理mutable。 雖然我認爲const的情況是非常安全的,因爲人們會默認爲物理只讀(減去舊的邏輯例外),正確處理mutable令我困惑。 例如使用新的線程條件下似乎是錯誤的:可變函子仍然「有效」使用

int main() { 
    int n; 
    [=]() mutable {n = 10;}(); 
    return n; 
} 

我會假設,在這種情況下,n將不得不被包裹成一個std::atomicn副本在併發寫入的保護其他方式!?

+0

你正在談論哪個'n'?在'main'中聲明的變量或lambda中的副本? – Henrik

+1

新的'mutable'條件只適用於顯式標記的對象,在這種情況下,'n'的* copy *。 – abergmeier

+2

拉姆達的'mutable'是一個與成員不同的'mutable'。它只是表示成員'operator()'不*標記爲'const'。 – Xeo

回答

1

這可能是更清晰的給你,如果我們寫的拉姆達出明確:

struct mylambda 
{ 
    mylambda(int n) : n(n) {} 

    void operator()() /* const <- lambda specified as mutable, operator not const */ 
    { 
     n = 10; 
    } 

private: 
    int n; 
}; 

int main() { 
    int n = 0; 
    mylambda(n)(); 
    return n; 
} 

(旁註:你確實有在你的例子不確定的行爲,因爲當你的拉姆達副本n,它是從一個未初始化的變量讀。我已經在這裏初始化它來修復這個小錯誤。)

正如你所看到的,你沒有可變成員,所以沒有什麼需要改變爲線程安全的(根據談話)。只是一個正常的成員變量,可以通過非const的成員函數進行更改;非const成員函數不被認爲是線程安全的。

我不知道你是否可以將lambda成員標記爲mutable;如果可以的話,您可能處於線程安全問題(與const函數調用操作符相關)的位置。但我不認爲這是可能的。