繁体   English   中英

当复制构造函数在 C++ 中不可用时,为什么不调用复制赋值运算符?

[英]Why isn't the copy assingnment operator called when the copy construcotr is not available in C++?

为什么当我们说我有一个这样声明的对象时: Obj o1; 它由默认构造函数初始化(这里不是很重要, o1是如何初始化的,重点是它被初始化了),我以这种方式创建了另一个对象: Obj o2 = o1; 隐式调用复制构造函数,但是如果我删除复制构造函数,则会出现编译错误。 为什么对象o1未分配/复制到o2 ,例如: Obj o1; Obj o2; o2 = o1; Obj o1; Obj o2; o2 = o1; ? 为什么编译器试图在任何实例中调用构造函数? Obj o2 = o1;=运算符吗Obj o2 = o1; 超载?

正如评论中提到的,这

Obj o2 = o1;

与赋值无关。 有点不幸,经常令人困惑的是,使用=进行初始化,否则=意味着赋值。

在评论中还提到, operator=必须假设左运算符已经存在。 考虑这个有点人为的例子:

#include <vector>

struct my_vect {
    my_vect() : data(2) {}
    my_vect(const my_vect& other) : data(other.data) {}
    my_vect& operator=(my_vect& other) {
        // this has already been constructed,
        // hence data.size() is 2 already
        data[0] = other.data[0];
        data[1] = other.data[1];
        return *this;
    }
private:
    std::vector<int> data;
};

它是一个包含大小始终为2std::vector的结构。 在构造my_vect初始化向量。 将一个my_vect分配给另一个时,不需要初始化data 只有值必须被复制。 因为operator=假设左侧运算符已经正确构造(它只是复制到data[0]data[1] )它不可能用于构造对象(在示例中,访问data[0]data[1]将超出范围)。

TL;DR:构造函数构造对象。 分配分配给一个已经存在的对象。 那是两件根本不同的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM