7

我正在编写标准 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(f)明确返回吗?

4

1 回答 1

3

来自 Josuttis 的C++ 标准库

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

X foo ()
{
X x;
...

return x;
}

保证以下行为:

• 如果 X 具有可访问的副本或移动构造函数,编译器可能会选择忽略该副本。这就是所谓的(命名的)返回值优化 ((N)RVO),它甚至在 C++11 之前就已经指定,并且被大多数编译器支持。

• 否则,如果 X 具有移动构造函数,则移动 x。

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

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

§25.2.4 (for_each)

要求:功能应满足MoveConstructible(表20)的要求。[注:功能不需要满足 CopyConstructible 的要求(表 21)。-结束注]

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

于 2013-08-24T12:56:32.750 回答