web-dev-qa-db-ja.com

C ++ラムダキャプチャこれと参照によるキャプチャ

メンバー関数を呼び出すラムダを生成する必要がある場合、参照でキャプチャするか、「this」をキャプチャする必要がありますか?私の理解では、「&」は使用される変数のみをキャプチャしますが、「this」はすべてのメンバー変数をキャプチャします。 「&」を使用する方が良いですか?

class MyClass {
  public:
    int mFunc() {
      // accesses member variables
    }

    std::function<int()> get() {
      //return [this] () { return this->mFunc(); };
      //  or
      //return [&] () { return this->mFunc(); };
    }

  private:
    // member variables
}
14
vikky.rk

提供した特定の例では、thisによるキャプチャーが必要です。概念的に、thisの値を変更することはできないため、参照によってthisを参照でキャプチャすることはあまり意味がありません。クラスまたはクラスインスタンスのアドレスを取得します。ラムダ関数内で、thisポインターを暗黙的に使用するものにアクセスする場合(たとえば、明示的にthisを使用せずにメンバー関数を呼び出す、またはメンバー変数にアクセスする)、コンパイラーは、とにかくthisを使用していました。複数のキャプチャをリストすることもできるため、メンバーとローカル変数の両方をキャプチャする場合は、参照または値のどちらでキャプチャするかを個別に選択できます。次の記事では、ラムダとキャプチャの基礎について説明します。

https://crascit.com/2015/03/01/lambdas-for-lunch/

また、この例では、std::functionを戻り値の型として使用して、ラムダを呼び出し元に返します。 std::functionは必ずしも思ったほど安価ではないことに注意してください。したがって、ラムダをstd::functionでラップするのではなく直接使用できる場合は、より効率的です。次の記事は、元の質問に直接関連していませんが、ラムダとstd::functionに関連する有用な資料を提供します(セクションを参照してください) 、しかし一般的な記事は興味深いかもしれません):

https://crascit.com/2015/06/03/on-leaving-scope-part-2/

15
Craig Scott

ここ&thisおよびその他は、キャプチャリストで使用される場合を示します。

あなたの場合、あなたがしなければならないことは、現在実行中のメソッドのthisによって実際に参照されるインスタンスのメンバー関数を呼び出すことであると仮定して、thisをキャプチャに入れますリストで十分です。

6
skypjack

thisのキャプチャと参照によるキャプチャは、2つの直交する概念です。 1つ、両方、またはなしを使用できます。参照によってthisをキャプチャすることは意味がありませんが、値によってthisをキャプチャしながら、参照によって他の変数をキャプチャできます。

2
R Sahu