2016-09-30 7 views
21

次のコード行はどういう意味ですか?私が意味する機能の前に[&]は何を意味しますか?

auto allowed = [&](int x, const std::vector<int>&vect){ 

.... 

} 

[&]は何をするのでしょうか?それは変数の同じ名前で機能していますか?

それはこのように使用するので:unsigned short ok = get_allowed(0, vect);

+1

これはラムダのキャプチャリストです(http://en.cppreferenceを参照)。com/w/cpp/language/lambda) –

+0

これは関数ではなく、ラムダです。あなたはそれらを読んでください – Hayt

+0

ちょうど頭が上がって、私はこの質問の欺瞞として[this](http://stackoverflow.com/questions/12262019/c-operator)を閉じました。 IMHOここの答えはより詳細です。 – NathanOliver

答えて

45

これは、ラムダ関数が範囲内のすべての変数を参照で取得することを意味します。

ラムダに渡されたもの以外の他の変数を使用する場合は、capture-clause []を使用できます。 あなたがそれぞれ&と=を使用して指定することができ、参照と値の両方でキャプチャすることができます:値によって、範囲内

  • [=]捕獲をすべての変数
  • [&]キャプチャを参照することによりスコープ内のすべての変数
  • [&var]キャプチャvar参照
  • [&, var]デフォルトの キャプチャ方法は参照であり、キャプチャする場合はvar
  • [=, &var]
  • は、デフォルトで値によってスコープ内の変数を取り込むが、参照 を用いvarを取り込む代わり
+0

良い点*参考文献で*。 Upvoted。 – Bathsheba

+0

もちろん、C++ 11で欠けているのは、少なくとも1つのクラスメンバー変数を取得できることです。その場合、古き良き関数オブジェクトにフェイルオーバーする必要があります。 – Bathsheba

+0

正しく指されていれば、クラスメンバ変数の場合に 'this'ポインタを取得する必要があります。 – user3286661

13

それはラムダキャプチャリストだとC++ 11標準のC++で定義されています。

[&]これは、すべての変数に現在アクセスしたいという意味で、はラムダ機能の範囲内にあります。

クロージャが呼び出された時点で、参照されているオブジェクトが有効範囲内にあることを確認してください。そうでなければ、プログラムの動作は未定義です。

5

これは基本的に名前のない関数であるラムダ式を定義します。それはパラメータリスト(int x, const std::vector<int>&vect)と機能本体{ ... }を持っています。しかし、最初にキャプチャリストを持っています[&]。ラムダ式の本体から変数(パラメータではない)にアクセスする場合は、ラムダ式が後で使用されるように、式を「変数を自分自身で取る」必要があります実行される。

変数のリストを指定するか、「すべて」を使用してすべての変数を取り込むことができます。 [&]は、参照によってすべてをキャプチャすることを意味し、[=]は、すべてを値でキャプチャすることを意味します。

[&]を使用する場合、ラムダ本体はラムダが実行された時点で有効であった値ではなく、ラムダが実行された時点で変数の値を使用することに注意してください!これは、値のコピーであり、その参照のみです。)

+1

Upvoted;最後にはいい点があります。私の答えで言及しているように、ぶら下がっている参照事例に言及することは自由に気をつけてください。 – Bathsheba

+0

最後にあなたが作ったポイントについてもUpvoted。 –

関連する問題