为什么我们需要对unique_ptr的vector进行移动构造?

时间:2013-10-07 08:40:13

标签: c++ visual-c++ c++11

似乎VC11 Update 2在std :: vector中推送unique_ptr时需要一个Move Constructor。这是记录在案的行为还是已知的Bug?

#include < iostream>
#include <memory>
#include <vector>
struct TEST
{
    std::unique_ptr<int> m_l;
    TEST(
        std::unique_ptr<int>&& l)
    {
        m_l = std::move(l);
    };
    //Move Contructor for Test
    TEST(TEST&& o)
    {
        m_l = std::move(o.m_l);
    }
};
void Bar()
{
    std::vector<TEST> vec;
    std::unique_ptr<int> a(new int);
    //Compiles fine without a Move Constructor
    TEST(std::move(a));
    //Requires a Move Contructor to compile
    vec.push_back(
        TEST(std::move(a)));
}
int main()
{       
    Bar();
    return 0;
} 

注意

我尝试了上面的代码在IDEONE C++11上没有移动构造函数,它编译得很好。

1 个答案:

答案 0 :(得分:3)

您不必自己编写移动构造函数;在这种情况下,它应该由编译器自动生成。但是,VC11没有实现此功能,并且在VS2013之前不会添加IIRC。

请注意,VC11正在抱怨,因为std::unique_ptr数据成员的存在会导致您的复制构造函数被删除。 §12.8p11描述了删除类的复制构造函数的过程:

  

隐式声明的复制/移动构造函数是内联公共   同类的成员。 X类的默认复制/移动构造函数   如果X有

,则定义为已删除(8.4.3)      

[...]

     

- 非静态数据成员   类型M (或其数组)无法复制 /移动因为   重载决议(13.3),适用于M的相应   构造函数,导致歧义或被删除的函数或   默认构造函数无法访问,

     

[...]