c++ - 使用 std::move 返回 std::vector

标签 c++ return move

我有一个非常基本的问题:返回 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 .. 等...以这种方式?

最佳答案

你声明了一个通过右值引用返回的函数——这几乎永远不应该做(如果你通过引用返回局部对象,你最终会得到一个悬空引用)。而是声明函数按值返回。这样,调用者的值将由函数返回的右值构造。返回值也将绑定(bind)到任何引用。

其次,不,您应该使用显式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.
}

更多信息:

关于c++ - 使用 std::move 返回 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44065808/

相关文章:

c++ - C++读取二进制文件的方法

c++ - std::array 使用大括号复制构造

c++ - 整数到 bool 数组

iPhone 键盘返回键会将光标移动到下一个文本字段

c - 这里 printf 和 return 之间的区别令人困惑?

gcc - 避免 move 构造函数的成员数组对象的初始化

c++ - 如何返回指向数组中对象的指针?

c - 返回一个大变量与使用参数中提供的指针设置它

cocoa - 如果我尝试将项目替换为不同的卷,replaceItemAtURL 将不起作用

vba - 在 vba 中向下 move 行范围