自從c++17開始,如果lambda表示式符合要求的話,該表示式會隱式轉換為constexpr表示式。(表示式內沒有靜態變數,沒有虛函式,沒有 try/catch語句, 沒有new/delete關鍵字)。如下:
auto squared = (auto val) ;//隱式轉換為constexpr表示式,即可以在編譯器求值。
std::arraya;
如果表示式不滿足轉換要求,則不能轉換為constexpr,即只能在執行期執行。
auto squared2 = (auto val) ;
//error: 不能在編譯器求值。
std::arraya;
//執行期可以正確執行。
std::cout << squared2(5) << std::endl;
如果不確定是否會隱式轉換為constexpr,可以加上關鍵字 constexpr來判斷一下(如果不滿足轉換則編譯不通過)
// 正確編譯
auto squared3 = (auto val) constexpr ;
// 編譯錯誤
auto squared4 = (auto val) constexpr ;
二、向lambda傳遞this的拷貝
如果成員函式內有lambda表示式,在表示式內希望呼叫其他成員函式或變數時,我們需要在中新增捕捉物件說明。如:
class c ;
auto l2 = [=] ;
auto l3 = [&] ;
}};
然而這有乙個問題,就是說如果lambda表示式在呼叫時,傳遞進來的物件已經銷毀了,這樣就會引發錯誤。c++17中,我們可以在lambda表示式的捕獲類別裡寫上*this,表示傳遞到lambda中的是this物件的拷貝。從而解決上述的問題。(注:c++11中是不允許這樣寫的。成員捕獲列表中只能是變數、」=「、」&「、」=, 變數列表「、」&, 變數列表「 )
class data
std::thread startthreadwithcopyofthis() const );
return t;
}};int main()
; t = d.startthreadwithcopyofthis();
} // d已經銷毀
t.join();
return 0;
}
C 表示式樹Lambda擴充套件(四)
本來計算這篇文章在後面需要運用的時候寫的,但是既然寫到表示式的擴充套件呢,就一起寫完吧。看到這個標題就有一種疑問,lambda表示式本來就是表示式樹,還需要怎麼擴充套件?那就看看下面的內容,你就知道了。表示式系列目錄 c 表示式樹講解 一 c 表示式樹遍歷 二 c 表示式樹分頁擴充套件 三 c 表示...
擴充套件方法 委託和Lambda
舉例演化lambda string names 問題 從陣列names中篩選字元長度為5的成員 先宣告乙個返回型別為bool的靜態函式 public static bool islengthfive string s return s.length 5 enumerable中的where方法是擴充套...
擴充套件方法 委託和Lambda
舉例演化lambda string names 問題 從陣列names中篩選字元長度為5的成員 先宣告乙個返回型別為bool的靜態函式 public static bool islengthfive string s return s.length 5 enumerable中的where方法是擴充套...