删除副本分配运算符可防止移动分配

时间:2019-07-03 12:56:35

标签: c++ move

我有一个课,其中有一个删除的副本分配运算符。

struct Foo
{
    Foo& operator=(const Foo&) = delete;
}

我想通过编写以下内容将此类的对象重置为其默认状态:

foo = Foo();

这会产生以下编译错误:

  

错误:使用已删除的功能“ Foo&Foo :: operator =(const Foo&)”

但是,如果我明确地默认移动分配运算符,则上面的代码不会产生编译错误。

为什么在没有显式默认移动赋值运算符的情况下,编译器尝试调用复制赋值运算符?当操作员的右侧是临时对象时,不应该总是调用移动版本吗?

完整的示例:

struct Foo
{
    //Foo& operator=(Foo&&) = default;  // uncomment and the compile error disappears 
    Foo& operator=(const Foo&) = delete;
};

int main()
{
    Foo foo;
    foo = Foo();

    return 0;
}

Link to online compiler.

0 个答案:

没有答案