値によるC ++ 0xラムダキャプチャは常にconst?


102

値でキャプチャし、キャプチャした値を非定数にする方法はありますか?ライブラリのファンクターがあり、const以外のメソッドをキャプチャして呼び出したいのですが、constにする必要があります。

以下はコンパイルされませんが、foo :: operator()constを作成すると修正されます。

struct foo
{
  bool operator () ( const bool & a )
  {
    return a;
  }
};


int _tmain(int argc, _TCHAR* argv[])
{
  foo afoo;

  auto bar = [=] () -> bool
    {
      afoo(true);
    };

  return 0;
}

回答:


165

可変を使用します。


auto bar = [=] () mutable -> bool ....

変更可能でない場合は、ラムダオブジェクトconstの演算子()を宣言しています。


-5

可変を使用する別の方法があります(Crazy Eddieによって提案されたソリューション)ます。

[=]あなたのブロックは、値で、すべてのオブジェクトをキャプチャします。[&]を使用して、参照によってすべてのオブジェクトをキャプチャできます。

auto bar = [&] () -> bool

または特定のオブジェクトのみを参照してキャプチャすることもできます[=、&afoo]

auto bar = [=, &afoo] () -> bool

詳細については、このページを参照してください(説明セクション):http : //en.cppreference.com/w/cpp/language/lambda


11
これは完全に異なることを行います。互換性はありません。これはOPの質問には応答しません。
Edward Strange

1
このソリューションの問題は、ラムダが実行される前に破棄されたキャプチャされたローカル変数に対して機能しないことです(たとえば、デタッチされたstd :: threadを開始するとき)。
Simon Ninon 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.