提问人:Curious 提问时间:3/3/2017 更新时间:3/3/2017 访问量:269
为什么 std::p romise::set_value() 有两个重载
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);
这至少具有以下两个好处
使用户能够在需要时将值移动到 promise/future 中,因为 API 参数是一种值类型。当不支持复制时,很明显该值将被复制。此外,当传递到函数中的表达式是 prvalue 时,编译器可以很容易地完全省略它(尤其是在 C++17 中)
它传达了这样一个观点,即类需要值的副本比完成相同任务的两个重载更好、更简洁。
我正在制作一个类似的 API(就所有权而言),我想知道 C++ 标准库采用的设计决策与我提到的相比有什么好处。
谢谢!
答:
1赞
Kerrek SB
3/3/2017
#1
如果一个参数需要无条件地“转移”,那么按值传递一个参数,然后从它移动是一个巧妙的小技巧,但它确实至少会引起一个强制性移动。因此,此技巧最好用于很少或仅在完全由作者控制的情况下使用的叶代码。
相比之下,如果一个核心库的用户和用途大多不为作者所知,则不应不必要地增加可避免的成本,并且提供两个单独的参考参数重载更有效。
简而言之,你的叶子和用户越多,你就越应该倾向于简单而不是微优化,而你拥有的库越多,你就越应该不遗余力地做到通用和高效。
评论