1. ホーム
  2. c++

[解決済み] c++11のラムダは使用しない変数を捕捉するか?

2022-06-26 20:31:27

質問

を使用する場合 [=] を使って、すべてのローカル変数をラムダ内の値で捕捉するように指示した場合、結果的に すべて になるのでしょうか、それともすべてのローカル変数が で使用される全てのローカル変数をコピーするか、あるいは、ラムダ ?

では、例えばiの場合。

vector<int> my_huge_vector(100000);
int my_measly_int;
some_function([=](int i){ return my_measly_int + i; });

my_huge_vectorはラムダで使っていないのに、コピーされるのでしょうか?

どのように解決するのですか?

キャプチャリストに明示的に指定された各変数がキャプチャされます。 デフォルトのキャプチャでは、(a)キャプチャリストに明示的に名前がない、かつ、(b)の変数のみがキャプチャされます。 使用される である変数のみをキャプチャします。 変数が明示的に命名されておらず、ラムダ式でその変数を使用していない場合、その変数はキャプチャされません。 あなたの例では my_huge_vector は捕捉されません。

C++11 §5.1.2[expr.prim.lambda]/11 による。

もし ラムダ式 が関連する キャプチャデフォルト とその 複合ステートメント odr-uses this または自動保存期間を持つ変数と odr-used エンティティが明示的に捕捉されていない場合は odr-used エンティティは暗黙的に捕捉されると言われています。

ラムダ式には、関連するキャプチャーのデフォルトがあります。デフォルトでは、変数を値でキャプチャするために [=] .

変数が使用される場合(One Definition Ruleの意味での "used")にのみ、変数は暗黙的に捕捉されます。 あなたは my_huge_vector を使用していないので、暗黙のうちに捕捉されることはありません。

5.1.2/14の続きへ

以下の場合、エンティティはコピーによって捕捉されます。

  • の場合、暗黙のうちにキャプチャされ capture-default = または
  • を含まないキャプチャで明示的にキャプチャされた場合、そのキャプチャは & .

あなたの my_huge_vector は暗黙的にキャプチャされず、明示的にキャプチャされないので、コピーでも参照でも、全くキャプチャされません。