使用std::带向量移动 我有一个关于使用 STD的问题::在C++中移动< /COD> >

使用std::带向量移动 我有一个关于使用 STD的问题::在C++中移动< /COD> > ,c++,c++11,move-semantics,C++,C++11,Move Semantics,假设我有以下类,它在构造函数中以std::vector作为参数: class A { public: A(std::vector<char> v): v(v) {} private: std::vector<char> v; }; 如果我想打电话给下面的人呢 class A { public: A(std::vector<char> v): v(std::move(v)) {} private: std::vector<

假设我有以下类,它在构造函数中以
std::vector
作为参数:

class A
{
public:
    A(std::vector<char> v): v(v) {}
private:
    std::vector<char> v;
};
如果我想打电话给下面的人呢

class A
{
public:
    A(std::vector<char> v): v(std::move(v)) {}
private:
    std::vector<char> v;
};
std::vector<char> v;
A a(std::move(v));
std::vector v;
A(std::move(v));

第二个版本的构造函数可以吗,或者我应该为一个采用
std::vector&
A
创建另一个构造函数吗?

您应该编写一个移动构造函数

A::A( std::vector<char>&& vec): v(std::move(vec) {}
A::A(std::vector&&vec):v(std::move(vec){
如果不是你写的,你可以在这里多拿一份

你必须记住,你的向量将被“移开”。因此,如果你写下如下内容:

std::vector<char> v;
A a(std::move(v));
std::vector v;
A(std::move(v));
因此,在调用A的构造函数之后,不应使用向量v。所有元素都被移走,内容的迭代器无效。该向量可用于存储新数据

所以如果你写

std::vector<char> v;
A a(v);
std::vector v;
A(v);
这将导致像您的示例中那样的移动,没有人会期望这样的移动。

创建两个构造函数: 第一个构造函数应为by const&,第二个为rvalue&&以便可以使用移动语义:

class A
{
public:
    A(const std::vector<char>& v_) : v(v_) { std::cout << "const& ctor\n"; }
    A(std::vector<char>&& v_) : v(std::move(v_)) { std::cout << "rvalue&& ctor\n"; }
private:
    std::vector<char> v;
};
A类
{
公众:

A(const std::vector&v_uu):v(v_){std::cout多次使用向量,您可以通过值接受向量并从中移动。因此

A(std::vector<char> v): v(std::move(v)) {}

你的第二个计划很好

第二个版本只需移动向量两次(将按值参数移动到您的成员中)。如果您不介意额外移动的成本,您可以坚持只将按值参数移动到您的成员中


如果您不介意的话,那么为参数的不同值类别创建两个构造函数。

实际上,我读到移动后可以使用向量:没有“离开”正在发生。向量在移动后是空的。您可以使用它来存储新值。只应使用现有的迭代器。谢谢,是的,我在回答中澄清了这一点为什么复制构造函数会有两个副本?@MinhTran copy ctor将首先被调用以创建临时
v
变量(ctor中的参数)第二次是从v temporary创建v成员变量。
int main()
{
    std::vector<char> v1{ 'a', 'b', 'c', 'd' };
    A a1(v1);
    A a2(std::vector<char>{ 1, 2, 3, 4 });
   return 0;
}
A(std::vector<char> v): v(std::move(v)) {}
A a(std::vector<char>{....}); // <--- 1
std::vector<char> my_vec;
A b(my_vec); // <--- 2
A(const std::vector<char>& v) : v(v) { }
A(std::vector<char>&& v) : v(std::move(v)) { }