일반 람다는 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
'Programing' 카테고리의 다른 글
| 이 코드가 64 비트 아키텍처에서는 segfault이지만 32 비트에서는 잘 작동하는 이유는 무엇입니까? (0) | 2020.08.08 |
|---|---|
| DESTDIR 및 PREFIX of make (0) | 2020.08.08 |
| JavaScript 정적 분석 도구가 있습니까? (0) | 2020.08.08 |
| 표준 Scala 클래스를 사용하여 Scala에서 JSON을 구문 분석하는 방법은 무엇입니까? (0) | 2020.08.08 |
| python pandas : 인수가있는 함수를 계열에 적용 (0) | 2020.08.07 |