1.基本的な文法
[キャプチャリスト](パラメータリスト)可変(オプション)例外属性->戻り値の型{ //関数本体}
構文規則:ラムダ式は、関数名が省略された一般的な関数と見なすことができ、戻り値は->の形式で表されます。通常の機能との唯一の違いは、「キャプチャリスト」の追加です。
次に、キャプチャリストを理解します
いわゆるキャプチャリストは、実際にはパラメータの一種として理解できます。デフォルトでは、ラムダ式の内部関数本体は関数本体の外部の変数を使用できません。現時点では、キャプチャリストを使用して外部データを転送できます。パラメータを渡す動作に
応じて、キャプチャリストは次のタイプに分類できます。
1.価値の獲得
値によるパラメーターの受け渡しと同様に、値キャプチャの前提は、変数をコピーできることです。違いは、キャプチャされた変数は、ラムダ式が呼び出されたときではなく、作成されたときにコピーされることです。
void lambda_value_capture() {
int value = 1;
auto copy_value = [value] {
return value;
};
value = 100;
auto stored_value = copy_value();
std::cout << "stored_value = " << stored_value << std::endl;
// 这时, stored_value == 1, 而 value == 100.
// 因为 copy_value 在创建时就保存了一份 value 的拷贝
}
2.リファレンスキャプチャ
参照によってパラメータを渡すと同様、基準キャプチャ保存し、参照を、その値が変化します。
void lambda_reference_capture() {
int value = 1;
auto copy_value = [&value] {
return value;
};
value = 100;
auto stored_value = copy_value();
std::cout << "stored_value = " << stored_value << std::endl;
// 这时, stored_value == 100, value == 100.
// 因为 copy_value 保存的是引用
}
3.暗黙的なキャプチャ
キャプチャリストを手動で作成することは、非常に複雑な場合があります。この機械的な作業はコンパイラで処理できます。このとき、キャプチャリストに&または=を記述して、参照または値でキャプチャすることをコンパイラに宣言できます。キャプチャー。
void lambda_reference_capture() {
int value = 1;
auto copy_value = [&] {
return value;
};
value = 100;
auto stored_value = copy_value();
std::cout << "stored_value = " << stored_value << std::endl;
// 这时, stored_value == 100, value == 100.
// 因为 copy_value 保存的是引用
}
4.空のキャプチャリスト
キャプチャリスト '[]'は空です。これは、Lambdaが関数で変数を使用できないことを意味します。
#include <iostream>
int main()
{
int c = 12;
auto Add = [](int a, int b)->int {
return c; // 编译失败,c没有被捕获
};
std::cout << Add(1, 2) << std::endl;
return 0;
}
5.式のキャプチャ
上記の値キャプチャと参照キャプチャは、外部スコープで宣言されている変数であるため、これらのキャプチャメソッドは、右辺値ではなく左辺値をキャプチャします。
C ++ 14以降では、右辺値のキャプチャがサポートされ、キャプチャされたメンバーを任意の式で初期化できます。宣言されたキャプチャ変数のタイプは、式に従って判断されます。判断方法は、基本的にautoを使用する場合と同じです。
#include <iostream>
#include <utility>
int main()
{
auto important = std::make_unique<int>(1);
auto add = [v1 = 1, v2 = std::move(important)](int x, int y) -> int {
return x + y + v1 + (*v2);
};
std::cout << add(3,4) << std::endl;
return 0;
}
上記のコードでは、unique_ptr専用ポインターが重要であり、キャプチャできません。この時点で、それを右辺値に転送し、式で初期化する必要があります。
6.ジェネリックラムダ
C ++ 14より前は、ラムダで表される仮パラメーターは特定の型のみを指定でき、汎用ではありませんでした。エキサイティングなことは、C ++ 14以降、Lambda関数の仮パラメーターがautoキーワードを使用して、ある意味でジェネリックスを生成できることです。
auto add = [](auto x, auto y) {
return x+y;
};
add(1, 2);
add(1.1, 2.2);
3、まとめ
キャプチャは、ラムダ式で外部値を使用する機能を提供します。キャプチャリストの最も一般的に使用される4つの形式は、
次のとおりです。•[]空のキャプチャリスト
•[name1、name2、...]一連の変数をキャプチャするには
•[ &]引用キャプチャ、コンパイラにキャプチャリストを独自に派生させ
ます•[=]値キャプチャ、コンパイラに推定参照リストを実行させます
キャプチャリスト構文テーブルの表示:
キャプチャリスト | 説明 |
---|---|
[] |
空のキャプチャリスト。lambda 関数内の変数は使用できません。一つはlambda 、変数がキャプチャされた後にのみ、それらを使用することができます。 |
[names] |
names これは、名前のコンマ区切りのリストです。これらの名前はlambda 、それらが配置されている関数内のすべてのローカル変数です。キャプチャリスト内の変数はすべてコピーされます。名前の前に使用されている場合& は、参照キャプチャメソッドが使用されます。 |
[&] |
暗黙のキャプチャリストは参照によってキャプチャされます。lambda 本体で使用されている関数のエンティティはすべて参照により使用されます。 |
[=] |
値キャプチャ方法を使用した暗黙的なキャプチャリスト。 |
[&, identifier_list] |
identifier_list それが配置されている関数からの0個以上の変数を含むコンマ区切りのリストです。これらの変数は値によってキャプチャされ、暗黙的にキャプチャされた変数は参照によってキャプチャされます。identifier_list の名前の前では使用できません& |
[=, identifier_list] |
identifier_list の変数は参照によってキャプチャされ、暗黙的にキャプチャされた変数は値によってキャプチャされます。identifier_list の名前を含めることはできません。this 前に使用する必要があります& |
[注]上記の内容の多くは、ここから抜粋して拡張した「Modern C ++ Tutorial」からのものであり、学習ノートとして使用する必要があります。