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

Inb*_*ong 7 c++ std c++-standard-library move-semantics c++11

我正在编写标准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).
Run Code Online (Sandbox Code Playgroud)

我认为函数范围局部变量在返回时是移动构造的.我应该move(f)明确回来吗?

P0W*_*P0W 3

来自 Josuttis 的C++ 标准库

\n\n

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

\n\n
X foo ()\n{\nX x;\n...\n\nreturn x;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

保证以下行为:

\n\n

\xe2\x80\xa2 如果 X 有可访问的复制或移动构造函数,编译器可能\n 选择删除该复制。这就是所谓的(命名)返回值优化 ((N)RVO),它甚至在 C++11 之前就已指定,并且大多数编译器都支持。

\n\n

\xe2\x80\xa2 否则,如果 X 有移动构造函数,则移动 x。

\n\n

\xe2\x80\xa2 否则,如果 X 有复制构造函数,则复制 x。

\n\n

\xe2\x80\xa2 否则,将发出编译时错误。

\n\n

来自\xc2\xa725.2.4 (for_each)

\n\n
\n

要求:函数应满足 MoveConstructible\n 的要求(表 20)。[注:函数不需要满足\n CopyConstructible(表21)的要求。\xe2\x80\x94结束注]

\n
\n\n

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

\n