似乎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上没有移动构造函数,它编译得很好。
答案 0 :(得分:3)
您不必自己编写移动构造函数;在这种情况下,它应该由编译器自动生成。但是,VC11没有实现此功能,并且在VS2013之前不会添加IIRC。
请注意,VC11正在抱怨,因为std::unique_ptr
数据成员的存在会导致您的复制构造函数被删除。 §12.8p11描述了删除类的复制构造函数的过程:
隐式声明的复制/移动构造函数是内联公共 同类的成员。 X类的默认复制/移动构造函数 如果X有:
,则定义为已删除(8.4.3)[...]
- 非静态数据成员 类型M (或其数组)无法复制 /移动因为 重载决议(13.3),适用于M的相应 构造函数,导致歧义或被删除的函数或 默认构造函数无法访问,
[...]