复制构造函数中出现异常的可能原因是什么

What are possible reasons for exception in copy constructors?

本文关键字:是什么 异常 构造函数 复制      更新时间:2023-10-16

我在Herb Sutter的书中看到,复制构造函数可能会引发异常。

我的第一个问题是,复制构造函数是否总是会抛出异常?

我的第二个问题是,如果一个复制构造函数不使用复制构造函数中的新运算符和其他函数,是否还有可能的异常?

如果你所说的"执行异常"意味着它可能会抛出异常,那么不是。并不是每个复制构造函数都会抛出异常。如果类只包含一个int,而复制构造函数只复制了int,那么它就不可能抛出异常。

任意复制构造函数是否会抛出异常,实际上只是一般问题的一个特例,任何函数都会抛出异常吗?

正如您所期望的,这完全取决于它所调用的其他函数的作用。如果它们中的任何一个使用throw或执行一些抛出异常的特殊行为(可能是定义了实现),那么它可能会抛出异常。否则不会。

理论上,除了析构函数和main之外,几乎任何C++函数都可能引发异常,这取决于程序员所写的内容。

并非所有复制构造函数都抛出异常。例如,默认情况下,任何"纯旧数据"或"标准布局"结构/类都有永远不会抛出的复制构造函数。然而,大多数值得讨论的类都包含mapvectorstring,所有这些类都具有可能抛出std::bad_alloc的复制构造函数。

struct person {
    char name[20];
    int id;
    int height;
};

到目前为止,std::bad_alloc是复制构造函数中最常见的异常,但任何异常都是可能的。要了解复制可能引发的异常,您必须查看特定类的规范。