返回std::for_each中的std::move(f)
Returning std::move(f) in std::for_each
我正在编写一个标准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)
,您可以保证能够从外部读取突变状态。
相关文章:
- Usages of std::move
- 在C++中对T*类型执行std::move的意外行为
- 关于std::move的使用,是否有编译警告
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 通过实例理解std::move及其目的
- 返回一个带有 std::move 的对象并链接函数
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- std::move a const std::vector in a lambda capture
- "std::forward"和"std::move"真的不生成代码吗?
- 如何在没有 std::move 的情况下移动临时对象
- 关于在成员重载中使用 std::move() 的问题
- 显式清除 std::move 之后的源资源
- std::move 如何使原始变量的值无效?
- 复制elision、std::move和链式函数调用
- 如果真的需要std::move,我们应该什么时候声明右值refs
- 使用std::move将std::unique_ptr作为qt信号参数传递
- 无法使用带有 std::move 的自定义删除器插入 std::unique_ptr
- C++:我应该在 return 语句中显式使用 std::move() 来强制移动吗?
- 编译器是否足够聪明,以至于 std::move 变量超出范围?
- std::move() 或其在局部变量上的显式等价物可以允许 elision 吗?