1. ホーム
  2. c++

[解決済み】C++11のラムダは、なぜデフォルトでcapture-by-valueに "mutable "キーワードを要求するのでしょうか?

2022-04-01 18:04:52

質問

簡単な例です。

#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 というキーワードがあります。従来の名前付き関数へのパラメータ渡しとはかなり違います。その理由は何でしょうか?

Capture-by-Valueのポイントは、ユーザーが一時的なものを変更できるようにすることだという印象があります。

何かご教示ください。

(ちなみにMSVC2010を使用しています。)

解決方法は?

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