我有一个课,其中有一个删除的副本分配运算符。
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;
}