对于使用非引用类型实例化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 ++标准库所采用的设计决策有什么好处,而不是我提到的。
谢谢!
答案 0 :(得分:1)
如果需要无条件地“转移”然后从中移动,则按值传递参数是一个巧妙的小技巧,但它确实会产生至少一个强制移动。因此,这种技巧最适用于很少使用的叶代码或仅在完全受作者控制的情况下使用。
相比之下,一个核心库,其用户和使用对于作者来说大多是未知的,不应该不必要地增加可避免的成本,并且提供两个单独的参考参数重载更有效。
简而言之,你的叶子和用户越多,你就越喜欢简单而不是微优化,你的库越多,你应该越努力保持通用和高效。