![](/img/trans.png)
[英]Why does `std::promise::set_value` throw an error when invoked from the main thread?
[英]Why does std::promise::set_value() have two overloads
對於使用非引用類型實例化std::promise<>
的情況,為什么set_value()
方法具有兩個不同的重載而不是一個值傳遞重載?
因此,而不是以下兩個
std::promise::set_value(const Type& value);
std::promise::set_value(Type&& value);
只有一個
std::promise::set_value(Type value);
這至少具有以下兩個好處
由於API參數是一種值類型,因此使用戶能夠在需要時將其值移動到promise / future中。 當不支持復制時,很明顯將要復制該值。 此外,當傳遞到函數中的表達式為prvalue時,編譯器可以輕松地將其完全刪除(尤其是在C ++ 17中)
它傳達了這樣一個觀點,即類比完成同一任務的兩個重載要好得多,而且要簡潔得多。
我正在制作一個類似的API(就所有權而言),我想知道C ++標准庫采用的設計決策與我提到的相比有什么好處。
謝謝!
如果需要無條件地“傳遞”值,則按值傳遞參數,然后再將其移走是一個巧妙的小技巧,但它確實會引起至少一個強制性的動作。 因此,此技巧是在很少使用或僅在完全受作者控制的情況下使用的葉代碼中最好的方法。
相反,作者和用戶大多不了解其用戶和使用的核心庫不應不必要地增加可避免的成本,並且提供兩個單獨的參考參數重載更為有效。
簡而言之,您的葉子和用戶越多,您越應該偏向於簡化而不是微優化,而庫越多,您就越應該走出通用和高效的道路。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.