2013-05-02 63 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

相关问题