2017-11-21 27 views
3

以下のような高次クラスを2つのラムダ関数a1()とa2()を含むメソッドA()で考えてみましょう。私はa1の中からa2を呼び出すことができるようにしたいと思います。私は(A1内部の二行目)、そうするときしかし、私はエラーを取得するラムダ関数を別のラムダ関数から呼び出す方法

エラー:

の変数は、「デフォルトのキャプチャモードが指定されていないため、暗黙的に取得することができません」私はしないでくださいこのエラーメッセージを理解してください。私はここで何を捕まえることになっていますか? [this]をラムダ定義に使用すると、fooクラスのメソッドにアクセスできますが、私が望むことをやる方法は不明です。

私はこれをまっすぐに設定していただきありがとうございます。

class foo 
{ 
    void A() 
    { 
     auto a2 = [this]() -> int 
     { 
     return 1; 
     }; 

     auto a1 = [this]() -> int 
     { 
      int result; 
      result = a2(); 
      return result; 
     }; 

     int i = a1(); 
     int j = a2(); 
    } 
}; 

答えて

4

あなたはa1の本体内ODR-使用a2するためにa2をキャプチャする必要があります。単にthisをキャプチャしても、a2はキャプチャされません。キャプチャthisでは、囲むクラスの非静的メンバーのみを使用できます。 a2がデフォルトでキャプチャされることが予想される場合は、キャプチャデフォルトとして=または&のいずれかを指定する必要があります。

[this, &a2] // capture a2 by reference 
[this, &] // capture all odr-used automatic local variables by reference, including a2 
+0

すばらしい対応をありがとうございますが、私はまだ不明です。 [これ、&a2]は動作しますが、[これ、&]はありません。 – David

+3

@Davidはどのような意味で '[this、&]'は動作しませんか? – Brian

+0

@David - コンパイラとバージョンを指定すると便利です。たとえば、VS 2017では、エラーメッセージはかなり明確ですが、 '[&、this] 'でなければなりません。 – zzxyz