[英]Why use `std::bind_front` over lambdas in C++20?
正如措辭相似的問題( Why use bind over lambdas in c++14? )中提到的那樣,答案是 - 沒有理由(並且還提到了為什么使用 lambdas 會更好)。
我的問題是 - 如果在 C++14 中不再有使用綁定的理由,為什么標准委員會發現有必要在 C++20 中添加std::bind_front
?
它現在比 lambda 有什么新的優勢嗎?
bind_front
綁定第一個 X 參數,但如果可調用對象調用更多參數,它們將被添加到末尾。 當您只綁定 function 的前幾個參數時,這使得bind_front
非常可讀。
一個明顯的例子是為綁定到特定實例的成員 function 創建一個可調用對象:
type *instance = ...;
//lambda
auto func = [instance](auto &&... args) -> decltype(auto) {return instance->function(std::forward<decltype(args)>(args)...);}
//bind
auto func = std::bind_front(&type::function, instance);
bind_front
版本的噪音要小得多。 它直截了當,有 3 個命名的東西: bind_front
,要調用的成員 function ,以及將在其上調用它的實例。 這就是我們的情況所需要的:一個標記,表示我們正在創建 function 的第一個參數的綁定,要綁定的 function 以及我們要綁定的參數。 沒有多余的語法或其他細節。
相比之下,lambda 在這個位置有很多我們不關心的東西。 auto... args
位, std::forward
東西等。弄清楚它在做什么有點困難,而且閱讀起來肯定要長得多。
請注意, bind_front
根本不允許bind
的占位符,因此它並不是真正的替代品。 它更像是bind
最有用的 forms 的簡寫。
提出簡化部分 function 應用程序的論文有一些很好的引人注目的用例。 我將在這里總結它們,因為否則我將不得不引用大部分論文,所以一定要 go 看看:
使用 lambda 將涉及std::forward
樣板
如果通過值std::bind
和std::bind_front
存儲 object 傳播常量,但在捕獲 lambda 的情況下,用戶必須選擇可變或常量版本,從而產生問題
在用戶端使用 lambda 將涉及-> decltype(auto)
樣板。
就像保留可變性一樣,除了現在我們談論的是左值/右值並且只有std::bind_front
正確地做到這一點
傳播可變性和保留值類別的結果
這一點現在尤其重要,因為異常規范現在是類型系統的一部分
cppreference也有一些有用的注釋:
此 function 旨在替換 std::bind。 與 std::bind 不同,它不支持任意參數重新排列,並且對嵌套的綁定表達式或 std::reference_wrappers 沒有特殊處理。 另一方面,它關注調用包裝器 object 的值類別,並傳播底層調用運算符的異常規范。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.