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

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

在C ++ 11中用“auto”推導出lambda的類型是什么?

在C ++ 11中用“auto”推導出lambda的類型是什么?

C++
浮云間 2019-08-31 14:56:49
我有一種感覺,lambda的類型是一個函數指針。當我進行以下測試時,我發現它是錯誤的(演示)。#define LAMBDA [] (int i) -> long { return 0; }int main (){  long (*pFptr)(int) = LAMBDA;  // ok  auto pAuto = LAMBDA;  // ok  assert(typeid(pFptr) == typeid(pAuto));  // assertion fails !}上面的代碼是否缺少任何一點?如果不是那么,typeof用auto關鍵字推導出的lambda表達式是什么?
查看完整描述

3 回答

?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

lambda表達式的類型未指定。

但它們通常僅僅是仿函數的語法糖。lambda直接轉換為仿函數。里面的任何東西[]都變成了構造函數參數和仿函數對象的成員,里面的參數()變成了仿函數的參數operator()。

一個沒有變量的lambda(在[]s 里面沒有任何東西)可以轉換成一個函數指針(MSVC2010不支持這個,如果那是你的編譯器,但這個轉換是標準的一部分)。

但是lambda的實際類型不是函數指針。這是一些未指定的仿函數類型。


查看完整回答
反對 回復 2019-08-31
?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

它是一個唯一的未命名結構,它使函數調用運算符重載。lambda的每個實例都引入了一種新類型。

在非捕獲lambda的特殊情況下,該結構還具有對函數指針的隱式轉換。


查看完整回答
反對 回復 2019-08-31
?
慕森王

TA貢獻1777條經驗 獲得超3個贊

[C++11: 5.1.2/3]: 的類型的λ-表達(這也是封閉的對象的類型)是一個獨特的,無名不愈合類類型 -稱為閉合類型 -其特性如下所述。此類類型不是聚合(8.5.1)。閉包類型在包含相應lambda表達式的最小塊作用域,類作用域或命名空間作用域中聲明。[..]

該子句繼續列出此類型的不同屬性。以下是一些亮點:

[C++11: 5.1.2/5]:lambda表達式的閉包類型有一個公共inline函數調用操作符(13.5.4),其參數和返回類型分別由lambda-expressionparameter-declaration-clausetrailing-return-type描述[..]

[C++11: 5.1.2/6]:沒有lambda-capturelambda表達式的閉包類型有一個公共的非虛擬非顯式const轉換函數,用于指向具有與閉包類型的函數調用操作符相同的參數和返回類型的函數。此轉換函數返回的值應為函數的地址,該函數在調用時與調用閉包類型的函數調用運算符具有相同的效果。

最后一段話的結果是,如果您使用轉換,您將可以分配LAMBDApFptr。


查看完整回答
反對 回復 2019-08-31
  • 3 回答
  • 0 關注
  • 861 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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