0

给定以下代码片段,为什么没有选择复制赋值运算符?

它不会编译抱怨复制构造函数被删除。我尝试使用用户声明的赋值运算符,但它仍然不起作用。所以这不是一个隐含的生成规则被打破(这会阻止=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

我尝试了几个编译器。我的猜测是,声明必须调用复制构造函数,但我只是不明白如何或为什么。

4

0 回答 0