将向量(或其他任何东西)从外部移动到 class 成员的正确方法是什么?

What is the proper way to move a vector (or anything else) from outside to a class member?

struct Something { ... };

class MyClass
{
public:
    MyClass(std::vector<Something>&& vec)
    {
        myVec = vec;
    }
private:
    std::vector<Something> myVec;
};

void main()
{
    ...
    MyClass instance(std::move(someVector));
}

class MyClass
{
public:
    MyClass(std::vector<Something> vec)
    {
        myVec = std::move(vec);
    }
private:
    std::vector<Something> myVec;
};

void main()
{
    ...
    MyClass instance(someVector);
}

他们都错了吗?第二个看起来确实像。我还应该担心移动后将 "vec" 设置为某些 "valid data" 吗? 抱歉,我是 C++ 和移动语义的新手,感谢您的宝贵时间:)

两者都错了。第一个复制(在myVec = vec;),第二个也复制(在std::vector<Something> vec)。

您还应该使用右值引用构造 MyClassMyClass instance(std::move(someVector)).

操作方法如下:

class MyClass
{
public:
    MyClass(std::vector<Something>&& vec) : myVec(std::move(vec))
    {
    }
private:
    std::vector<Something> myVec;
};

void main()
{
    ...
    MyClass instance(std::move(someVector));
}

: myVec(std::move(vec)) 部分称为 member initializer list。在构造函数的主体中重新分配成员更有效。