2013-05-02 67 views
2

MSVC編譯器存在一個已知的缺陷,其中不會創建默認移動構件。std ::將一個std :: unique_ptr移動到stl容器中。 (MSVC編譯器問題)

問題是我有很多的類似於這樣的類:

struct User { 
    std::string FirstName; 
    std::string LastName; 
    std::string Address; 
    std::string PostalCode; 
    std::string City; 

    std::vector<std::unique_ptr<ProjectBase>> Projects; 
}; 

如何採取一個類像這樣並將其轉換成的東西,會在這種情況下工作:

std::vector<std::unique_ptr<User>> users; 
{ 
    // I use this logic often (create a temporary object and move it into stl container 
    auto new_user=make_unique<User>(); 
    users.push_back(std::move(new_a)); 
} 
users.back()->FirstName="Should"; 
users.back()->LastName="Work"; 

std::cout << "First Name: " << users.back()->FirstName << std::endl; 

上述代碼不適用於Windows Phone 8(因爲沒有移動構造函數),但可以與Visual Studio 2012(v110)工具包一起工作。

如果我的用戶類有移動構造函數,以便它可以與Windows Phone 8一起工作,它將如何?

+2

是否有一些原因,你創建一個變量形式'make_unique'而不是隻是'push_back(make_unique ())'? – 2013-05-02 02:06:41

+0

您是否嘗試過'User(User &&)= default;'? – 2013-05-02 02:21:05

+1

@VaughnCato:MSVC還不支持。 – 2013-05-02 02:43:41

回答

4

直接讓std::move調用移動構造函數的每個成員:

User(User&& u) 
    : FirstName(std::move(u.FirstName)), 
    LastName(std::move(u.LastName)), 
    Address(std::move(u.Address)), 
    PostalCode(std::move(u.PostalCode)), 
    City(std::move(u.City)), 
    Projects(std::move(u.Projects)) 
{} 

此外,使用make_unique<User>();,您將需要一個用戶定義的構造函數也即User(){}

+0

我有超過50個具有多級繼承的類。有沒有其他方法? – Grapes 2013-05-02 03:32:33

+0

@Grapes:您顯示的代碼需要移動ctor。由於編譯器不會爲您生成一個,因此您必須明確定義一個。否則,你唯一的選擇是避免任何需要移動的代碼。 – 2013-05-02 03:54:24

+2

@Grapes它很乏味,但它可能只需要幾個小時。責備VS並不是像他們應該那樣隱式生成它們。它使生活變得非常困難。請注意,如果您添加這些,請添加移動賦值運算符。 – David 2013-05-02 04:11:12

相關問題