c++ - 在 C++ 中使用 move 语义的正确方法是什么?

标签 c++ stl move move-semantics

考虑这段代码:

class A {
private:
    std::string data;
public:
    void set_data(std::string&& data) {
        this->data = std::move(data); // line 6
    }
};

int main() {
    std::string move_me = "Some string";
    A a;
    a.set_data(std::move(move_me)); // line 13
}

我知道我们需要在第 13 行调用 std::move() 以便它将左值转换为右值引用(听起来正确吗?我是新手) .

然而,在第 6 行,我们是否需要再次使用 std::move()?我假设不会,因为我们已经传递了一个右值引用并且将调用 std::string 的 move 构造函数。对吗?

最佳答案

However, on line 6, do we need to use std::move() again?

。为什么?因为在 set_data 中,data(参数)是一个左值,因为它有一个名字。两个 std::move 都是将 move_me 实际 move 到 a 中的 data 所必需的。

如果 6 行没有 std::movemove_me 将不会被 move ,因为那会调用 std::string(const std::string&),而不是 std::string(std::string&&)

记住 - 如果某物有名字,它就是一个左值。

关于c++ - 在 C++ 中使用 move 语义的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52353664/

相关文章:

c++ - libtool 有什么用处,什么时候用?

c++ - 自由人 : Unable to compile the Java API on Ubuntu

c++ - 修改后的Fibonacci C++产生较大的负数

c++ - 为什么 std::copy_if 签名不约束谓词类型

move - 如何在 iOS 的应用程序中从其他应用程序打开应用程序

c# - 有人能告诉我 AddForce 和 transform.translate 之间的区别吗?

c++ - MAC OSX 狮子 : gcc on mac not compiling wget

c++ - 使用 boost::lambda_ 压缩字符串中的空格

c++ - STL 的 allocator_traits 中静态成员函数的用途是什么?

css - 向右 move 100% 宽度的固定元素