亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通用Lambda在C ++ 14中如何工作?

通用Lambda在C ++ 14中如何工作?

C++
ITMISS 2019-12-11 13:09:56
通用Lambda如何auto在C ++ 14標準中工作(關鍵字作為參數類型)?是否基于C ++模板,其中每個不同的參數類型,編譯器都會生成具有相同主體但已替換類型的新函數(編譯時多態性),或者它更類似于Java的泛型(類型擦除)?代碼示例:auto glambda = [](auto a) { return a; };
查看完整描述

3 回答

?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

通用lambda在引入C++14。


簡單來說,由lambda表達式定義的閉包類型將具有模板化的調用運算符,而不是C++11的lambdas 的常規非模板調用運算符(當然,auto在參數列表中至少出現一次)。


所以你的例子:


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

將創建glambda此類型的實例:


class /* unnamed */

{

public:

    template<typename T>

    T operator () (T a) const { return a; }

};

C ++ 14標準草案n3690的5.1.2 / 5段指定了如何定義給定lambda表達式的閉包類型的調用運算符:


非通用lambda表達式的閉包類型具有公共內聯函數調用運算符(13.5.4),其參數和返回類型分別由lambda表達式的parameter-declaration-clause和Trailing-return-type描述。對于通用lambda,閉包類型具有一個公共的內聯函數調用操作員成員模板(14.5.2),該模板的template-parameter-list由一個發明的類型template-parameter組成,用于lambda的parameter-declaration-clause中每次出現的auto,按出場順序。如果相應的參數聲明聲明了功能參數包(8.3.5),則本發明的類型template-parameter是參數包。函數調用運算符模板的返回類型和函數參數是從lambda表達式的尾隨返回類型和參數聲明子句派生的,方法是將參數聲明子句的decl-specifiers中的auto每次出現替換為name相應的發明模板參數。


最后:


它是否類似于模板,對于每個不同的參數類型,編譯器都會生成具有相同主體但類型已更改的函數,還是與Java的泛型更相似?


如以上段落所述,泛型lambda只是具有模板化調用運算符的唯一未命名函子的語法糖。那應該回答你的問題:)



查看完整回答
反對 回復 2019-12-12
?
Helenr

TA貢獻1780條經驗 獲得超4個贊

這是提議的C ++ 14功能(不在C ++ 11中),與模板相似(甚至等效)。例如,N3559提供了以下示例:


例如,以下通用lambda-expression包含語句:


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;



查看完整回答
反對 回復 2019-12-12
  • 3 回答
  • 0 關注
  • 362 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號