我正在编写标准 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)
明确返回吗?
我正在编写标准 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)
明确返回吗?
来自 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)
可以保证您能够从外部读取变异状态。