将向量(或其他任何东西)从外部移动到 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
)。
您还应该使用右值引用构造 MyClass
: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(std::move(someVector));
}
: myVec(std::move(vec))
部分称为 member initializer list。在构造函数的主体中重新分配成员更有效。
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
)。
您还应该使用右值引用构造 MyClass
: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(std::move(someVector));
}
: myVec(std::move(vec))
部分称为 member initializer list。在构造函数的主体中重新分配成员更有效。