Programing

일반 람다는 C ++ 14에서 어떻게 작동합니까?

crosscheck 2020. 8. 8. 10:39
반응형

일반 람다는 C ++ 14에서 어떻게 작동합니까?


autoC ++ 14 표준에서 제네릭 람다는 어떻게 작동합니까 ( 인수 유형으로서의 키워드)?

각기 다른 인수 유형 컴파일러에 대해 동일한 본문이지만 대체 된 유형 (컴파일 시간 다형성)으로 새 함수를 생성하는 C ++ 템플릿을 기반으로합니까? 아니면 Java의 제네릭 (유형 삭제)과 더 유사합니까?

코드 예 :

auto glambda = [](auto a) { return a; };

일반 람다는 C++14.

간단하게 람다 식에 의해 정의 된 닫는 방법의 종류는 것이다 템플릿 호출 연산자보다는의 정기적, 비 템플릿 호출 연산자 C++11의 람다 (물론을 때 auto나타납니다 적어도 매개 변수 목록에 한 번).

따라서 귀하의 예 :

auto glambda = [] (auto a) { return a; };

glambda이 유형의 인스턴스를 만듭니다 .

class /* unnamed */
{
public:
    template<typename T>
    T operator () (T a) const { return a; }
};

C ++ 14 Standard Draft n3690의 5.1.2 / 5 단락은 주어진 람다 표현식의 클로저 유형에 대한 호출 연산자가 정의되는 방법을 지정합니다.

제네릭이 아닌 람다 식의 클로저 형식에는 매개 변수와 반환 형식이 각각 lambda-expression의 parameter-declaration-clause 및 trailing-return-type으로 설명되는 공용 인라인 함수 호출 연산자 (13.5.4)가 있습니다. 제네릭 람다의 경우 클로저 유형에는 람다의 parameter-declaration-clause에서 auto의 각 항목에 대해 하나의 발명 된 유형 template-parameter로 구성된 template-parameter-list의 공용 인라인 함수 호출 연산자 멤버 템플릿 (14.5.2)이 있습니다. 출현 순으로. 발명 된 유형 템플릿 매개 변수는 해당 매개 변수 선언이 함수 매개 변수 팩 (8.3.5)을 선언하는 경우 매개 변수 팩입니다. 함수 호출 연산자 템플릿의 반환 유형 및 함수 매개 변수는 parameter-declaration-clause의 decl-specifier에서 auto의 각 발생을 다음 이름으로 대체하여 lambda-expression의 후행 반환 유형 및 매개 변수 선언 절에서 파생됩니다. 상응하는 발명 된 템플릿 매개 변수.

드디어:

각기 다른 인수 유형 컴파일러에 대해 동일한 본문이지만 유형이 변경된 함수를 생성하는 템플릿과 유사합니까? 아니면 Java의 제네릭과 더 유사합니까?

위의 단락에서 설명했듯이 일반 람다는 템플릿이 지정된 호출 연산자를 사용하는 고유하고 이름이 지정되지 않은 펑터에 대한 구문 설탕 일뿐입니다. 귀하의 질문에 답해야합니다. :)


안타깝게도 C ++ 11 ( http://ideone.com/NsqYuq )의 일부가 아닙니다 .

auto glambda = [](auto a) { return a; };

int main() {}

g ++ 4.7 사용 :

prog.cpp:1:24: error: parameter declared ‘auto’
...

그러나 일반적인 람다에 대한 포틀랜드 제안에 따라 C ++ 14에서 구현 될 수있는 방법은 다음과 같습니다.

[](const& x, & y){ return x + y; }

이것은 대부분의 경우 익명 펑터 클래스의 일반적인 생성을 산출하지만 유형이 부족하면 컴파일러는 템플릿 멤버를 방출합니다 operator().

struct anonymous
{
    template <typename T, typename U>
    auto operator()(T const& x, U& y) const -> decltype(x+y)
    { return x + y; }
};

또는 Generic (Polymorphic) Lambda Expressions에 대한 새로운 제안 제안에 따라

auto L = [](const auto& x, auto& y){ return x + y; };

--->

struct /* anonymous */
{
    template <typename T, typename U>
    auto operator()(const T& x, U& y) const // N3386 Return type deduction
    { return x + y; }
} L;

그렇습니다. 매개 변수의 모든 순열에 대해 새로운 인스턴스화가 발생하지만 해당 펑터의 구성원은 여전히 ​​공유됩니다 (즉, 캡처 된 인수).


It's a proposed C++14 feature (not in C++11) similar (or even equivalent) to templates. For instance, N3559 provides this example:

For example, this generic lambda-expression containing statement:

auto L = [](const auto& x, auto& y){ return x + y; };

might result in the creation of a closure type, and object that behaves similar to the struct below:

struct /* anonymous */
{
    template <typename T, typename U>
    auto operator()(const T& x, U& y) const // N3386 Return type deduction
    { return x + y; }
} L;

참고URL : https://stackoverflow.com/questions/17233547/how-does-generic-lambda-work-in-c14

반응형