C++11 のラムダでは、デフォルトで値によるキャプチャに「mutable」キーワードが必要なのはなぜですか? 質問する

C++11 のラムダでは、デフォルトで値によるキャプチャに「mutable」キーワードが必要なのはなぜですか? 質問する

短い例:

#include <iostream>

int main()
{
    int n;
    [&](){n = 10;}();             // OK
    [=]() mutable {n = 20;}();    // OK
    // [=](){n = 10;}();          // Error: a by-value capture cannot be modified in a non-mutable lambda
    std::cout << n << "\n";       // "10"
}

質問: なぜmutableキーワードが必要なのでしょうか? これは、名前付き関数への従来のパラメータ渡しとはまったく異なります。その根拠は何ですか?

値によるキャプチャの全体的な目的は、ユーザーが一時的に変更できるようにすることだという印象を受けましたが、そうでなければ、ほとんどの場合、参照によるキャプチャを使用する方がよいのではないでしょうか。

何か気づきはありましたか?

(ちなみに私は MSVC2010 を使用しています。私の知る限り、これは標準のはずです)

ベストアンサー1

デフォルトでは、関数オブジェクトは呼び出されるたびに同じ結果を生成する必要があるため、これが必要ですmutable。これは、オブジェクト指向関数と、事実上グローバル変数を使用する関数の違いです。

おすすめ記事