2016-05-19 93 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

相關問題