C++11之后返回std::vector时会自动调用std::move嘛?

在函数内返回一个临时的容器对象是否需要手动的调用std::move, 编译器会自动优化吗?
关注者
31
被浏览
35,621

8 个回答

准确说,推荐的做法是返回值时 不要加 std::move。

C++17及以上:拷贝省略 Copy elision - cppreference.com

C++11及以上:返回值优化(RVO, return value optimization)。这个规则超复杂,而且和编译器支持有关。


加了std::move后会妨碍上面的优化。

不加std::move即使上面的优化不发生,( 当返回的“变量”的生命周期在函数外失效时 )也会进行move construction而非copy construction


-- 上面加粗部分举个反向例子 --

struct stringstream {
    //仅作示意,不代表std::stringstream内部结构