给定以下代码片段,为什么没有选择复制赋值运算符?
它不会编译抱怨复制构造函数被删除。我尝试使用用户声明的赋值运算符,但它仍然不起作用。所以这不是一个隐含的生成规则被打破(这会阻止=default
工作)。
struct obj {
obj() = default;
~obj() = default;
obj(const obj&) = delete;
obj(obj&&) = default;
obj& operator=(const obj&) = default;
// obj& operator=(const obj&) {return *this;} // nada
obj& operator=(obj&&) = default;
int t{42};
};
int main(int, char**) {
obj o1;
obj o2 = o1; // <-- problem is here
// but this is ok
obj o3;
o3.operator=(o1);
// or this
obj o4;
o4 = o1;
}
这是一个godbolt示例:https ://godbolt.org/z/MkZuGs
我尝试了几个编译器。我的猜测是,声明必须调用复制构造函数,但我只是不明白如何或为什么。