2016-01-13 9 views
75

私は[=]が何を知りたいですか?ここでは簡単な例C++ - [=]は何をしますか?

template <typename T> 
std::function<T (T)> makeConverter(T factor, T offset) { 
    return [=] (T input) -> T { return (offset + input) * factor; }; 
} 

auto milesToKm = makeConverter(1.60936, 0.0); 

だどうでしょう[]代わりの[=]とコードの仕事?

std::function<T (T)> 

は、引数や戻り値の型Tとして(T)を取得する関数のプロトタイプを意味しますか?

+0

これは、3つの異なる未確認の質問をしていると思われるもののために非常に投票され、[C++ 11のラムダ式とは何ですか?](https://stackoverflow.com/questions/7627098/what -is-a-lambda-in-c11) –

答えて

96

[=]はラムダ式のキャプチャリストの一部です。これは、ラムダ式が作成時に使用するすべてのローカル変数のコピーをラムダが取得できるように、ラムダ式内のコードが初期化されることをC++に伝えます。ラムダ式は、関数内のローカル変数でfactoroffset、を参照できるようにするためにこれが必要です。ラムダ式内のコードは、変数offsetfactorが参照するのか分からないので

あなたは[=][]とを交換する場合は、あなたは、コンパイラエラーを取得します。多くのコンパイラは、これを行うと、良い診断エラーメッセージを出しますので、試してみてください!

+12

「これは必要です」 - この正確なオプションは必要ありません。地元の人々にしていないことキャプチャー参照 - 我々はまた、 '[&]'、 '[=オフセット、=入力]'などM.M @ –

+1

を書くことができますか? – Useless

+5

@ M.M。ここで参照キャプチャを使用することは、ラムダが返されるとすぐにそれらのローカル変数の存続期間が終了するため、問題になります。しかし、個々の変数を個別にリストすることができます。 – templatetypedef

33

それはlambdaキャプチャリストです。変数をラムダに使用可能にします。値でコピーする[=]、または参照渡しの[&]を使用できます。

+2

何もキャプチャしない '[]'を使うこともできます。 :) –

+0

ええ、本当。 :-) – kometen

関連する問題