为什么 std::promise::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 参数是值类型。当不支持复制时,很明显该值将被复制。此外,当传递给函数的表达式是纯右值时,编译器可以轻松地将其完全省略(尤其是在 C++17 中)
它传达了一点,即 class 比完成相同任务的两个重载更好、更简洁地需要一个值的副本。
我正在做一个类似的 API(就所有权而言),我想知道 C++ 标准库采用的设计决策与我提到的相比有什么好处。
谢谢!
如果需要 "transferred" 无条件地按值传递一个参数然后从它移动是一个巧妙的小技巧,但它至少会导致一个强制移动。所以这个trick最好用在很少使用或者只在作者完全控制的情况下使用的leaf代码
相比之下,用户和用途大多为作者所知的核心库不应不必要地增加可避免的成本,提供两个单独的引用参数重载更有效。
简而言之,您的叶子和用户越多,您就越应该倾向于简单而不是微优化,您的库越多,您就越应该竭尽全力做到通用和高效。
对于使用非引用类型实例化 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 参数是值类型。当不支持复制时,很明显该值将被复制。此外,当传递给函数的表达式是纯右值时,编译器可以轻松地将其完全省略(尤其是在 C++17 中)
它传达了一点,即 class 比完成相同任务的两个重载更好、更简洁地需要一个值的副本。
我正在做一个类似的 API(就所有权而言),我想知道 C++ 标准库采用的设计决策与我提到的相比有什么好处。
谢谢!
如果需要 "transferred" 无条件地按值传递一个参数然后从它移动是一个巧妙的小技巧,但它至少会导致一个强制移动。所以这个trick最好用在很少使用或者只在作者完全控制的情况下使用的leaf代码
相比之下,用户和用途大多为作者所知的核心库不应不必要地增加可避免的成本,提供两个单独的引用参数重载更有效。
简而言之,您的叶子和用户越多,您就越应该倾向于简单而不是微优化,您的库越多,您就越应该竭尽全力做到通用和高效。