1

似乎 VC11 Update 2 在将unique_ptr' 推入 std::vector 时需要移动构造函数。这是记录在案的行为还是已知的错误?

#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上尝试了上面的代码,没有移动构造函数,它编译得很好。

4

1 回答 1

3

您不必自己编写移动构造函数;在这种情况下,它应该由编译器自动生成。然而,VC11 并没有实现这个功能,而且 IIRC 直到 VS2013 才会被添加。

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

隐式声明的复制/移动构造函数是其类的内联公共成员。如果 X 具有,则类 X 的默认复制/移动构造函数被定义为已删除(8.4.3)

[...]

—类类型 M (或其数组)的非静态数据成员,不能复制/移动,因为重载决议 (13.3) 应用于 M 的相应构造函数,导致歧义或函数从默认构造函数,

[...]

于 2013-10-07T08:44:35.837 回答