在下面的代码示例中,我没有特定的理由删除move构造函数,但是我不明白为什么要编译(x
是一个打印是否移动或复制的对象)。
class foo {
X x;
public:
foo()=default;
foo(const foo &)=default;
foo(foo &&)=delete;
};
int main()
{
vector<foo> v;
foo a;
v.push_back(a);
v.push_back(a);
}
第二次在push_back
上调用std::vector
时,通常使用移动操作来重新定位已经存在的对象。在foo
move构造函数声明为“默认”的情况下,我可以看到这种情况。
但是,当明确删除move构造函数时,我希望编译会失败,因为它仍可用于重载,但已删除。
它确实可以编译,并且向量重分配使用副本构造函数。
这是怎么回事?
答案 0 :(得分:3)
std::vector::resize()
将移动(如果可以移动),如果需要则进行复制。这是非常有用的,因为并非所有可复制类型都是可移动的。在c ++中请记住,对象是值类型,而不是引用类型。
答案 1 :(得分:0)
我认为您在使用复制构造函数,不是吗? foo(const foo &)
。在c ++中请记住,对象是值类型,而不是引用类型。
答案 2 :(得分:-1)
要将a
移到向量中,必须使其成为r值,即使用std::move(a)
而不是仅a
。
我相信,如果这样做,您的代码将在删除的移动ctor上出错。