返回 std::vector 和 std::move

Returning std::vector with std::move

我有一个非常基本的问题:使用 std::move return a std::vector<A> 是个好主意吗?例如:

class A {};
std::vector<A> && func() {
    std::vector<A> v;
    /* fill v */
    return std::move(v);
}

我应该return std::map, std::list..等等...这样吗?

启用优化的 gcc 和 clang 编译器在您 return 局部变量和您编写 std::move() 时为这两种情况生成相同的二进制代码。 只是 return 个值。

但是,如果您为自定义 class

创建移动构造函数并移动 operator=,则使用 &&noexcept 说明符很有用

您通过 r 值引用向 return 声明了一个函数 - 这几乎永远不应该完成(如果您通过引用 return 本地对象,您最终会得到一个悬空引用) .而是按值将函数声明为 return。这样,调用者的值将由函数编辑的右值 return 移动构造。 returned 值也将绑定到任何引用。

其次,不,你应该 return使用显式std::move,因为这会阻止编译器使用RVO。没有必要,因为编译器会在可能的情况下自动将任何左值引用 returned 转换为右值引用。

std::vector<A> func() {
    std::vector<A> v;
    /* fill v */
    return v; // 'v' is converted to r-value and return value is move constructed.
}

更多信息:

  • Using std::move() when returning a value from a function to avoid to copy
  • Is there any case where a return of a RValue Reference (&&) is useful?

不,不是。在某些情况下,这实际上可以防止复制省略。在一些编译器中甚至有一个关于它的警告,称为 -Wpessimizing-move.

与其他答案一致,只是 return 它的值,将 return 类型更改为 std::vector<A>,编译器将负责调用移动构造函数需要。

你可以看看我刚刚找到的这个post,它似乎解释得很详细(虽然我自己还没有通读): https://vmpstr.blogspot.hu/2015/12/redundant-stdmove.html