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)
明确回来吗?
来自 Josuttis 的C++ 标准库
\n\n您不需要也不应该 move() 返回值。根据语言规则,标准规定对于以下代码
\n\nX 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\n\n要求:函数应满足 MoveConstructible\n 的要求(表 20)。[注:函数不需要满足\n CopyConstructible(表21)的要求。\xe2\x80\x94结束注]
\n
有了std::move(f)
它,您就可以保证能够从外部读取突变状态。
归档时间: |
|
查看次数: |
471 次 |
最近记录: |