簡體   English   中英

通用C ++ 14 lambda和與模板的關系

[英]Generic C++14 lambdas and relationship with templates

我確實讀過帶有auto參數的C ++ 14泛型lambdas實際上是模板,所以以下是有效的C ++ 14

auto glambda = [] (auto a) { return a; };
cout << glambda(23); // Prints 23
cout << glambda('A'); // Prints A

這與我從模板中知道的內容並不完全相符..實例化點在哪里? 如果第一次調用使用int實例化模板而第二次使用char實例化模板,那么它存儲在glambda變量中的是什么?

並不是說“lambda是模板” - 這沒有意義,lambda是一個表達式。 相反,由lambda表達式定義的閉包對象的類型具有由成員函數模板定義的重載函數調用運算符。 因此,實例化點是相應調用操作符的第一次使用。

換句話說,lambda [a, &b](auto x, auto y) -> R { /* ... */ }的類型如下:

struct __lambda
{
    __lambda(const A & __a, B & __b) : a(__a), b(__b) {}

    template <typename T1, typename T2>
    R operator()(T1 x, T2 y) const { /* ... */ }

private:
    A a;
    B & b;
};

泛型lambda是編譯器生成類型的對象,其具有名為operator()的模板方法。 您可以使用以下等效代碼重寫代碼:

struct MyLambda {
    template<typename T>
    T operator() (T val) {
        return val;
    }
};

int main() {
    MyLambda func;

    std::cout << func('A');
    std::cout << func(42);
}

編譯器將在需要時實例化operator()

希望它有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM