用 std::move 返回 std::vector

新手上路,请多包涵

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

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

我应该以这种方式返回 std::mapstd::list .. etc…?

原文由 Koban 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

您声明一个函数以通过 r 值引用返回 - 这几乎不应该这样做(如果您通过引用返回本地对象,您最终会得到一个悬空引用)。而是将函数声明为按值返回。这样,调用者的值将由函数返回的 r 值构造。返回的值也将绑定到任何引用。

其次,不,您 不应 使用显式返回 std::move 因为这将阻止编译器使用 RVO 。没有必要,因为如果可能,编译器会自动将返回的任何左值引用转换为右值引用。

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

更多信息:

原文由 Felix Glas 发布,翻译遵循 CC BY-SA 4.0 许可协议

当您返回局部变量和编写 std::move() 时,启用优化的 gcc 和 clang 编译器都会为这两种情况生成相同的二进制代码。只需返回一个值。

但是使用 &&noexcept 说明符是有用的,如果你创建移动构造函数和移动 operator= 为你的自定义类

原文由 knst 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题