为什么此已删除的move构造函数会被编译器接受?

时间:2018-11-04 00:04:04

标签: c++ c++11 move

在下面的代码示例中,我没有特定的理由删除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构造函数时,我希望编译会失败,因为它仍可用于重载,但已删除。
它确实可以编译,并且向量重分配使用副本构造函数。

这是怎么回事?

3 个答案:

答案 0 :(得分:3)

std::vector::resize()将移动(如果可以移动),如果需要则进行复制。这是非常有用的,因为并非所有可复制类型都是可移动的。在c ++中请记住,对象是值类型,而不是引用类型。

答案 1 :(得分:0)

我认为您在使用复制构造函数,不是吗? foo(const foo &)。在c ++中请记住,对象是值类型,而不是引用类型。

答案 2 :(得分:-1)

要将a移到向量中,必须使其成为r值,即使用std::move(a)而不是仅a。 我相信,如果这样做,您的代码将在删除的移动ctor上出错。

相关问题