使用 std::move 返回 std::vector [重复]

问题描述 投票:0回答:3

我有一个非常基本的问题:使用

std::vector<A>
返回
std::move
是个好主意吗?例如:

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

我应该以这种方式返回

std::map
std::list
..等等吗?

c++ return move-semantics stdmove
3个回答
38
投票

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

其次,不,你不应该使用显式的std::move

返回,因为这会阻止编译器使用
RVO

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

-Wpessimizing-move

与其他答案一致,只需按值返回它,将返回类型更改为简单的

std::vector<A>

,编译器将在需要时负责调用移动构造函数。

你可以看看我刚刚找到的这篇文章,似乎解释得很详细(虽然我自己没有读过):

https://vmpstr.blogspot.hu/2015/12/redundant-stdmove.html


1
投票
当您返回局部变量和编写

std::move()

 时,启用优化的 gcc 和 clang 编译器都会生成相同的二进制代码。
只需返回一个值即可。

但是,如果您为自定义类创建移动构造函数和移动

&&

,则使用 
noexcept
operator=
 说明符非常有用

© www.soinside.com 2019 - 2024. All rights reserved.