2016-05-19 62 views
2

我有,我想节省一些打字,让编译器生成的移动构造函数和赋值操作符一个简单的数据类:默认的移动构造函数行为属性

class A 
{ 
public: 
    A(int x, std::string&& y) : x_(x), y_(std::move(y)) {} 
    A(A && a) = default; 
    A& operator= (A && a) = default; 
private: 
    int x_; 
    std::string y_; 
}; 

假设我的编译器是100%的C++ 11兼容,它将与std::string y_属性做正确的事情吗?它会将移动语义应用于它吗?

+1

如果你的编译器符合C++标准,那么它会做标准所要求的。所以一般你不应该担心你的编译器做了什么;只要遵循语言规则。 –

+0

(请注意,你的类现在有一个删除的拷贝构造函数([demo](http://ideone.com/02sbMw))。最好不要声明任何明确的隐式定义已经提供你需要的东西。) –

+1

你为什么认为它不会? 'std :: string'是可移动的。 – NathanOliver

回答

3

规则,从[class.copy],是:

的隐式定义的复制/移动构造函数为一个非工会类X执行其基础和成员的成员复制/移动 。

所以在这种情况下,它会移动,结构/分配既x_y_。从A,你是移动 - 构建/分配。


。请注意,默认的移动构造函数可以仍然执行拷贝如果其成员之一也没有隐含地定义了移动构造函数:

struct A { 
    A() { } 
    A(A const&) { } 
    // A(A&&) not implicitly defined because of the copy ctor 
}; 

struct B { 
    B() = default; 
    B(B&&) = default; 
    B& operator=(B&&) = default; 

    A a; 
}; 

B b; 
B c = std::move(b); // copy-constructs c.a from b.a 
1

是的,它会,这是产生特殊成员函数的关键。

但是,忘了构造函数的参数移动到构件:

A(int x, std::string&& y) : x_(x), y_(std::move(y)) {} 
//         ^^^^^^^^^^^
+0

谢谢。忘记了写一个简化的测试用例。问题已更新 – rustyx

相关问题