为什么 std::p romise::set_value() 有两个重载

Why does std::promise::set_value() have two overloads

提问人:Curious 提问时间:3/3/2017 更新时间:3/3/2017 访问量:269

问:

对于使用非引用类型实例化的情况,为什么该方法有两个不同的重载,而不是一个按值传递的重载?std::promise<>set_value()

所以而不是以下两个

std::promise::set_value(const Type& value);
std::promise::set_value(Type&& value);

只有一个

std::promise::set_value(Type value);

这至少具有以下两个好处

  1. 使用户能够在需要时将值移动到 promise/future 中,因为 API 参数是一种值类型。当不支持复制时,很明显该值将被复制。此外,当传递到函数中的表达式是 prvalue 时,编译器可以很容易地完全省略它(尤其是在 C++17 中)

  2. 它传达了这样一个观点,即类需要值的副本比完成相同任务的两个重载更好、更简洁。

我正在制作一个类似的 API(就所有权而言),我想知道 C++ 标准库采用的设计决策与我提到的相比有什么好处。

谢谢!

C++ C++11 承诺 未来 按值传递

评论


答:

1赞 Kerrek SB 3/3/2017 #1

如果一个参数需要无条件地“转移”,那么按值传递一个参数,然后从它移动是一个巧妙的小技巧,但它确实至少会引起一个强制性移动。因此,此技巧最好用于很少或仅在完全由作者控制的情况下使用的叶代码。

相比之下,如果一个核心库的用户和用途大多不为作者所知,则不应不必要地增加可避免的成本,并且提供两个单独的参考参数重载更有效。

简而言之,你的叶子和用户越多,你就越应该倾向于简单而不是微优化,而你拥有的库越多,你就越应该不遗余力地做到通用和高效。