簡體   English   中英

為什么在 C++20 中使用 `std::bind_front` 而不是 lambda?

[英]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::bindstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM