知识卡片

move与forward分工

普通读书笔记卡 · 1422

内容

具名右值引用形参作为表达式仍是左值,最后一次转交资源时用 std::move;通用引用用 std::forward 保留调用者的值类别。返回可做返回值优化的局部对象时不要显式 move,否则可能阻止消除构造的优化。选择转换前先确认是否还会使用该对象。

参考来源

- 位置:《Effective Modern C++》第5章《右值引用,移动语义,完美转发》,条款二十五:对右值引用使用 std::move ,对通用引用使用 std::forward(源文件:_epub-src/EPUB/text/ch006.xhtml) - 结论依据:原文要求最后使用时按引用种类选择转换,并明确禁止对可消除的局部返回对象使用 move。 - 原始内容:最后一次使用时,在右值引用上使用 std::move ,在通用引用上使用 std::forward 。 对按值返回的函数要返回的右值引用和通用引用,执行相同的操作。 如果局部对象可以被返回值优化消除,就绝不使用 std::move 或者 std::forward 。