首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用std::move返回std::vector

使用std::move返回std::vector
EN

Stack Overflow用户
提问于 2017-05-19 17:05:03
回答 3查看 15K关注 0票数 25

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

代码语言:javascript
复制
class A {};
std::vector<A> && func() {
    std::vector<A> v;
    /* fill v */
    return std::move(v);
}

我是否应该返回std::mapstd::list..等等。用这种方式?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-19 17:21:37

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

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

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

更多信息:

票数 31
EN

Stack Overflow用户

发布于 2017-05-19 17:24:05

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

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

你可以看看我刚刚找到的这篇文章,它似乎很详细地解释了它(尽管我自己没有读过它):https://vmpstr.blogspot.hu/2015/12/redundant-stdmove.html

票数 2
EN

Stack Overflow用户

发布于 2017-05-19 17:13:40

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44065808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档