2016-01-23 117 views
1

什么是移动构造函数的正确方法?移动构造函数C++

class A{ 
...some stuff... 
private: 
    int i; 
    std::string str; 
}; 

A::A(A &&a) 
{ 
    *this = std::move(a); 
}; 

A::A(A &&a) 
{ 
    this->str = std::move(a.str); 
}; 

在第二种情况下,它是有用的为std ::移动()int值?

+0

无论如何,我认为你应该明确地设置int。此时,该值保持未初始化状态。无论如何,在第一种情况下,您只需将移动构造函数重定向到copy/move-operator =(无论您实现哪个)。由于operator =在移动构造函数被声明时被隐式删除,所以会产生编译错误。如果你实现移动赋值,我不认为第一种情况是错误的,但它看起来类似于你是第二个移动构造函数。 – Herbert

+0

第二个选项只移动字符串,而不是对象本身。 你想移动对象及其成员,还是想克隆它? 移动意味着“移动语义”,而后者意味着“克隆”。 –

回答

6

应该

A::A(A&& other) 
    : i{other.i}, 
     str{std::move(other.str)} { 
    // nop 
} 

这是一个移动构造函数的默认实现。

+0

这不等于第二种情况(除了不初始化i)吗? – Herbert

+0

i {other.i} 和 i(other.i) ?之间存在差异? – Milow

+0

@赫伯特他们不是等价的。见[这里](http://en.cppreference.com/w/cpp/language/initializer_list)。 – Lingxi