autoC ++ 14 표준에서 제네릭 람다는 어떻게 작동합니까 ( 인수 유형으로서의 키워드)?
각기 다른 인수 유형 컴파일러에 대해 동일한 본문이지만 대체 된 유형 (컴파일 시간 다형성)으로 새 함수를 생성하는 C ++ 템플릿을 기반으로합니까? 아니면 Java의 제네릭 (유형 삭제)과 더 유사합니까?
코드 예 :
auto glambda = [](auto a) { return a; };
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-list가 하나의 발명 된 type template-parameter로 구성된 공용 인라인 함수 호출 연산자 멤버 템플릿 (14.5.2)이 있습니다. 출현 순으로. 발명 된 유형 템플릿 매개 변수는 해당 매개 변수 선언이 함수 매개 변수 팩 (8.3.5)을 선언하는 경우 매개 변수 팩입니다. 함수 호출 연산자 템플릿의 반환 유형 및 함수 매개 변수는 parameter-declaration-clause의 decl-specifier에서 auto의 각 항목을 다음 이름으로 대체하여 lambda-expression의 후행 반환 유형 및 매개 변수 선언 절에서 파생됩니다. 상응하는 발명 된 템플릿 매개 변수.
드디어:
각기 다른 인수 유형 컴파일러에 대해 동일한 본문이지만 유형이 변경된 함수를 생성하는 템플릿과 유사합니까? 아니면 Java의 제네릭과 더 유사합니까?
위의 단락에서 설명했듯이 일반 람다는 템플릿이 지정된 호출 연산자를 사용하는 고유하고 이름이 지정되지 않은 펑터에 대한 구문 설탕 일뿐입니다. 귀하의 질문에 답해야합니다. :)
int main () { struct X {}; std::vector<X> x; })
불행히도 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;
그렇습니다. 매개 변수의 모든 순열에 대해 새로운 인스턴스화가 발생하지만 해당 펑터의 멤버는 여전히 공유됩니다 (즉, 캡처 된 인수).
auto클래식 자동차와 동일한 공제 규칙을 가지고 있습니까? 템플릿 비유를 참조하면 자동이 자동이 아니라 템플릿 유형 추론과 동일한 규칙을 의미합니다. 그러면 질문은 다음과 같습니다. 템플릿 공제는 다음과 동일 auto합니까?
static또는 register:) 와는 대조적으로 사용 된 적이 있습니다. 어쨌든, 그렇습니다. auto거기 사용 한다는 것은 내부적으로 일반 템플릿이 생성된다는 것을 의미합니다. 사실, 람다는 컴파일러 내부에서 functor 클래스로 대체 될 것이며, auto매개 변수는 그것이 template <T> ... (T ...)방출 된다는 것을 의미합니다 .
템플릿과 비슷하거나 동등한 제안 된 C ++ 14 기능 (C ++ 11에는 없음)입니다. 예를 들어 N3559 는 다음 예를 제공합니다.
예를 들어 다음과 같은 일반적인 람다 식 포함 문 :
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;