5

私が理解しているよう[=]に、関数本体内で使用されるすべての変数をコピーしますが、ポインター[this]のみをコピーします。thisしかし、サンプルを見ると、どこで、または十分[=]であると広く使用されていることがわかります。代わりに使用する理由(パフォーマンスの向上など)はありますか?[this][this, foo][this][=]

4

1 に答える 1

10

あなたが言ったように、ラムダ内で実際に使用する[=]変数のみがにコピーされるため、パフォーマンスの向上はありません。†</sup>それは主にコーダー側の怠惰であり、ラムダヘッドを簡潔に保つことです。新しい変数を使用する場合は、キャプチャ句を拡張してそれらの変数を含める必要があります。ただし、参照によるキャプチャと値によるキャプチャを混在させる場合など、明示的にする必要がある場合もあります。


†現在、次のスニペットの[=](または)は、予想とは逆に、メンバー変数をラムダにコピーしないことに注意してください。[x]

struct X{
  std::function<void()> f(){
    return [=]{ std::cout << "x: " << x << "\n"; };
  }

  int x;
};

代わりに、のコピーを取得しますthis。これは、ラムダが親オブジェクトよりも長生きする場合に問題を引き起こす可能性があり、正しく動作させるには、現在、本体内にローカル名を作成し、fそれをキャプチャ/使用する必要があります。この名前は、参照または値のいずれかになります。コピーが1つ少ないので、参照を好みます(参照の場合、メンバーはラムダにのみコピーされますが、値の場合、メンバーは最初にそれにコピーされ、次にラムダにコピーされます)。‡</sup>

struct X{
  std::function<void()> f(){
    auto& x_ref = x;
    return [=]{ std::cout << "x: " << x_ref << "\n"; };
  }

  int x;
};

ただし、andcapture句でメンバーをコピーするという提案があります。参照が必要な場合は、キャプチャする必要があります。[=][member_name][this]


‡啓蒙のための@MooingDuckに感謝します。

于 2012-11-04T21:04:17.063 に答える