返回std::for_each中的std::move(f)

Returning std::move(f) in std::for_each

本文关键字:std move each for 返回 中的      更新时间:2023-10-16

我正在编写一个标准c++库的实现以供研究。

C++11标准规定for_each返回std::move(f)

template <class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f);
Returns: std::move(f).

我认为函数作用域局部变量在返回时是move构造的。我应该显式返回move(f)吗?

来自Josuttis的C++标准库

您不必也不应该移动()返回值。根据语言规则,该标准规定,对于以下代码

X foo ()
{
X x;
...
return x;
}

保证以下行为:

•如果X有一个可访问的复制或移动构造函数,编译器可以选择取消复制。这就是所谓的(命名的)返回值优化((N)RVO),甚至在C++11之前就已经指定大多数编译器都支持。

•否则,如果X有一个移动构造函数,则X被移动。

•否则,如果X具有复制构造函数,则复制X。

•否则,将发出编译时错误。

来自§25.2.4(针对每个)

要求:功能应满足MoveConstructable的要求(表20)。【注:功能无需满足CopyConstructable(表21)--尾注]

使用std::move(f),您可以保证能够从外部读取突变状态。