람다 식 구문
이 항목에서는 람다 식의 구문을 설명합니다.람다 식 및 예제를 이러한 요소 관계의 구조적 요소를 보여 주는 예제를 제공 합니다.
다음 프로그램 람다 식을 두 STL 알고리즘을 사용 하 여: generate_n 및 for_each.람다 식 호출에 나타나는 generate_n 함수 할당의 요소는 vector 개체 두 이전 요소의 합.람다 식 호출에 표시 되는 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
람다 매개 변수 선언
: (람다 매개 변수의 선언 목록최적) 사양을 변경할 수 있는동의 예외 사양동의 람다 반환 형식 절최적
람다 매개 변수의 선언 목록
: 람다 매개 변수
| 람다 매개 변수,람다 매개 변수의 선언 목록
람다 매개 변수
: decl-지정자-seq 선언 자
반환 형식 절 람다
: ->type-id
다음 섹션에 소개 하는 문법 관계 설명 합니다.
람다 식의 속성
다음 그림에서는 예제를 문법을 매핑합니다.
설명선에서 그림은 다음과 같습니다.
람다-introducer (라고 절을 캡처 이 항목의 뒷부분에 나오는)
람다 매개 변수의 선언 목록 (라고 매개 변수 목록 이 항목의 뒷부분에 나오는)
변경할 수 있는 사양 (라고 변경 가능한 사양 이 항목의 뒷부분에 나오는)
예외 사양이 (라고 예외 사양 이 항목의 뒷부분에 나오는)
반환 형식 절 람다 (라고 반환 형식이 이 항목의 뒷부분에 나오는)
포로 문 (라고 람다 본문 이 항목의 뒷부분에 나오는)
다음 섹션에서는 문법에 자세히 설명합니다.
절을 캡처
람다 식에는 자동 저장 기간이 며 바깥쪽 범위에서 액세스할 수 있는 어느 변수에 액세스할 수 있습니다.캡처 절 람다 식의 본문이 값별 또는 참조별 바깥쪽 범위의 변수 액세스 여부를 지정: 앰퍼샌드 변수 (&) 접두사가 없는 변수 참조 서 액세스를 & 접두사 값에 액세스 합니다.빈 캡처 절, [], 람다 식의 본문이 없는 바깥쪽 범위의 변수 액세스 한다는 것을 나타냅니다.
기본 캡처 모드 캡처 변수가 명시적으로 지정 하지 않은 값 또는 참조로 캡처되는 여부를 지정 합니다.기본 캡처 모드를 지정할 수 있습니다 (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 키워드 람다 식의 본문 외부 변수를 해당 복사본을 수정할 수 있도록 x 및 y, 람다 식을 값으로 캡처하는.람다 식의 변수를 캡처하여 때문에 x 및 y 값으로 해당 값이 남아 1 를 호출 하면 generate_n.
예외 사양
사용할 수 있는 throw() 람다 식 예외를 throw 하지 않는 나타내려면 예외 사양.일반 함수를 사용 하는 Visual C++ 컴파일러 경고를 생성 하는 대로 C4297 람다 식을 선언 하는 경우는 throw() 람다 본문과 예외 사양 하면 예외가 throw 됩니다, 다음 예제와 같이:
// throw_lambda_expression.cpp
int main() // C4297 expected
{
[]() throw() { throw 5; }();
}
예외 사양에 대 한 자세한 내용은 예외 사양.
반환 형식
람다 식의 반환 형식이 부분에 일반 메서드 또는 함수 반환 형식 부분을 유사합니다.그러나 반환 형식 매개 변수 목록을 따르고 포함 해야 -> 전에 반환 형식입니다.
람다 식 본문은 단일 return 문이 포함 또는 람다 식 값을 반환 하지 않는 경우 람다 식의 반환 형식이 부분을 생략할 수 있습니다.람다 식 본문에 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.