ラムダ式の構文
このトピックでは、ラムダ式の構文について説明します。構造要素のラムダ式」および「例にこれらの要素を関連付ける方法を示す例が用意されています。
次のプログラムでは、ラムダ式で 2 つの STL アルゴリズムを使用して: generate_nとfor_each。ラムダ式の呼び出しで表示される、 generate_n関数の要素を割り当てます、 vectorオブジェクトには、前の 2 つの要素の合計。ラムダ式の呼び出しで表示される、 for_each関数は、同じ要素を出力vectorコンソール オブジェクト。
// lambda_structure.cpp
// compile with: /EHsc
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
// The number of elements in the vector.
const int elementCount = 9;
int main()
{
// Create a vector object with each element set to 1.
vector<int> v(elementCount, 1);
// These variables hold the previous two elements of the vector.
int x = 1;
int y = 1;
// Assign each element in the vector to the sum of the
// previous two elements.
generate_n(v.begin() + 2, elementCount - 2, [=]() mutable throw() -> int {
// Generate current value.
int n = x + y;
// Update previous two values.
x = y;
y = n;
return n;
});
// Print the contents of the vector.
for_each(v.begin(), v.end(), [](int n) { cout << n << " "; });
cout << endl;
// Print the local variables x and y.
// The values of x and y hold their initial values because
// they are captured by value.
cout << x << " " << y << endl;
}
詳細については、 generate_n機能を参照してくださいgenerate_n。詳細については、 for_each機能を参照してくださいfor_each。
以下の説明では、文章のラムダ式と各要素が、先ほどの例に関連しています。
ラムダ式の文法
次の正式な定義の文法は、ラムダ式の BNF 形式を示しています。
ラムダ式
: ラムダ introducer ラムダ パラメーター宣言選択複合ステートメント
ラムダ ・ introducer
: [lambda-captureopt]
ラムダ キャプチャ
: - デフォルトのキャプチャ
| キャプチャのリスト
|既定キャプチャ,キャプチャ一覧
既定キャプチャ
: &
| =
キャプチャのリスト
: キャプチャ
|キャプチャのリスト,キャプチャ
キャプチャ
: 識別子
|&識別子
| this
ラムダ パラメーターの宣言
: (ラムダ パラメーターの宣言リストopt) mutable 仕様opt例外仕様optラムダ return type 句脱退
ラムダ パラメーターの宣言リスト
: ラムダ パラメーター
|ラムダ パラメーター,ラムダ パラメーターの宣言リスト
ラムダ パラメーター
: seq の宣言で指定子の宣言
ラムダ-戻り値-型-句
: ->type-id
次のセクションでは、文法の例では、導入方法との関係について説明します。
ラムダ式のプロパティ
次の図を例に文法をマップします。
コールアウトの図では次のとおりです。
ラムダ ・ introducer (と呼ばれる句をキャプチャこのトピックで後述)
ラムダ パラメーターの宣言リスト (と呼ばれる パラメーター リストこのトピックで後述)
mutable 仕様 (呼ば mutable 仕様このトピックで後述)
例外仕様 (と呼ばれる 例外仕様このトピックで後述)
ラムダ-戻り値-型-句 (と呼ばれる 戻り値の型このトピックで後述)
複合文 (と呼ばれる ラムダ本文このトピックで後述)
次に、文章校正の詳細を説明します。
句をキャプチャします。
ラムダ式自動ストレージ存続期間を持ち、外側のスコープでアクセスできる任意の変数にアクセスできます。キャプチャ句は値渡しまたは参照渡しには外側のスコープ内の変数、ラムダ式の本体を取得するかどうかを指定します。 アンパサンドを持つ変数 (&) プレフィックスは参照していない変数にアクセス、 &プレフィックスは値によってアクセスされます。空のキャプチャ句で、 []、外側のスコープ内の変数、ラムダ式の本体にアクセスしないことを示します。
既定キャプチャ モードキャプチャの変数を明示的に指定しないをキャプチャは値渡しまたは参照渡しかどうかを指定します。既定キャプチャ モードを指定することができます (capture-default構文) を指定する&または=キャプチャ句の最初の要素として。&要素を指定して、明示的に指定しない限り、ラムダ式の本体はキャプチャしたすべての変数参照によってアクセスします。=要素を指定して、明示的に指定しない限り、ラムダ式の本体はキャプチャしたすべての変数値によってアクセスします。たとえば、ラムダ式の本体外部変数にアクセスする場合、 total参照して外部変数factor値では、次のキャプチャ句、同等です。
[&total, factor]
[&, factor]
[=, &total]
クラスのメソッドの本体にラムダ式を使用できます。渡す、 this 、外側のクラスのメソッドとデータ メンバーにアクセスを提供するために、キャプチャ句へのポインター。クラスのメソッドにラムダ式を使用する方法の例については、例を参照してください: ラムダ式を使用してメソッドのトピックのラムダ式の例。
パラメーター リスト
ラムダ式のパラメーター リストは、パラメーター リストが、次の例外、関数のようになります。
パラメーター リストは、既定の引数をことはできません。
パラメーター リストは、可変長の引数リストを指定できません。
パラメーター リストのパラメーターを無名ができません。
ラムダ式の引数として別のラムダ式を使用できます。詳細については、このトピックでは、高順ラムダ式を参照してくださいラムダ式の例。
ラムダ式のパラメーター リストを省略できます。ラムダ式に引数を渡さないし、ユーザーが提供しない場合、パラメーター リストを省略できます、 mutable-specification、 exception-specification、およびlambda-return-type-clauseの要素。次の例では、パラメーター リストを省略するラムダ式を示しています。
// lambda_parameter_list.cpp
int main()
{
int x = 4;
int y = 5;
int z = [=] { return x + y; }();
}
変更可能な仕様
Mutable 仕様部品値をキャプチャする変数を変更するには、ラムダ式の本体をできます。この例を使用して、 mutableキーワード ラムダ式の本体の外部変数のコピーを変更できるようにするには、 xとy、値でのラムダ式のキャプチャ。ラムダ式を変数にキャプチャするためxとy値によって、その値を維持1への呼び出し後generate_n。
例外の指定
使用できます、 throw() 、ラムダ式が例外をスローしないことを示す例外仕様。通常の関数では、Visual C コンパイラの警告が生成されますよう C4297 ラムダ式を宣言している場合、 throw()例外仕様とラムダ本文は、例外をスローを次の例に示すよう。
// throw_lambda_expression.cpp
int main() // C4297 expected
{
[]() throw() { throw 5; }();
}
例外の仕様の詳細についてを参照してください例外の設計。
Return Type
ラムダ式の戻り値の型の部分には、通常のメソッドまたは関数の戻り値の型に似ています。ただし、戻り値の型、パラメーターのリストに依存して、含める必要があります-> 、戻り値の型の前にします。
ラムダ本体 1 つ return ステートメントが含まれているか、ラムダ式は、値を返さない場合は、ラムダ式の戻り値の型の部分を省略できます。1 つ return ステートメント ラムダ本文内にある場合は、コンパイラは、戻り値の型、戻り値の式の型から導出します。それ以外の場合、コンパイラには、戻り値の型を推測void。
ラムダ式の戻り値として別のラムダ式を作成できます。詳細については、このトピックでは、高順ラムダ式を参照してくださいラムダ式の例。
ラムダ本文
ラムダの本体は、ラムダ式のものは、通常のメソッドまたは関数の本文に含めることができますを含めることができます。普通の関数とラムダ式の本体は次の種類の変数にアクセスできます。
パラメーター
ローカルに宣言された変数
クラスのデータ メンバー (クラスの内部で宣言する場合)
静的ストレージ期間 (たとえば、グローバル変数) を持つ任意の変数
さらに、ラムダ式は、外側のスコープからキャプチャする変数にアクセスできます。変数で明示的にキャプチャされたは、ラムダ式のキャプチャ句で表示された場合。それ以外の場合は、変数であるに暗黙的にキャプチャされた。ラムダ式の本体は、暗黙的にキャプチャされるアクセス変数に既定キャプチャ モードを使用します。
lambda_parameter_list.cppローカル変数は暗黙的にキャプチャの例xとy値。次の例では、明示的には変数をキャプチャするラムダ式が含まれているn値は、暗黙的に変数のキャプチャm参照によって。
// captures_lambda_expression.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main()
{
int m = 0, n = 0;
[&, n] (int a) mutable { m = ++n + a; }(4);
cout << m << endl << n << endl;
}
次の使用例は、次のように、コンソールを印刷します。
5
0
変数n値によって、その値がキャプチャされた0 、ラムダ式の呼び出し後。
ラムダ式は、自動ストレージ存続期間を持つ変数のみキャプチャできますが、ラムダ式の本体で静的ストレージ期間を持つ変数を使用できます。次の使用例を使用して、 generate関数とラムダ式内の各要素に値を割り当てるには、 vectorオブジェクト。ラムダ式は、次の要素の値を生成するのには、静的変数を変更します。
// lambda_static_variable.cpp
// compile with: /c /EHsc
#include <vector>
#include <algorithm>
using namespace std;
void fillVector(vector<int>& v)
{
// A local static variable.
static int nextValue = 1;
// The lambda expression that appears in the following call to
// the generate function modifies and uses the local static
// variable nextValue.
generate(v.begin(), v.end(), [] { return nextValue++; });
}
詳細については、 generate機能を参照してくださいgenerate。