C 17 6 lambda擴充套件

2021-09-23 22:15:00 字數 1246 閱讀 1494

自從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方法是擴充套...