复制构造函数中出现异常的可能原因是什么?
What are possible reasons for exception in copy constructors?
我在 Herb Sutter 的书中看到复制构造函数可能会抛出异常。
我的第一个问题是复制构造函数是否总是会抛出异常?
我的第二个问题是,如果一个拷贝构造函数不使用new运算符和拷贝构造函数内部的其他函数,是否还有可能出现异常?
除了析构函数和 main
之外的任何 C++ 函数理论上都可以抛出异常,这取决于程序员编写的内容。
并不是所有的拷贝构造函数都会抛出异常。例如,任何 "Plain Old Data" 或 "standard layout" structs/classes 默认情况下都有永远不会抛出的复制构造函数。然而,大多数值得讨论的 classes 包含 map
或 vector
或 string
,所有这些都有可能抛出 std::bad_alloc
的复制构造函数.
struct person {
char name[20];
int id;
int height;
};
到目前为止,std::bad_alloc
是复制构造函数中最常见的异常,但任何异常都是可能的。要找出复制可能引发的异常,您必须查看特定 class 的规范。
如果 "do an exception" 你的意思是它可能会抛出异常,那么不会。并非每个复制构造函数都这样做。如果class只包含一个int,复制构造函数只是复制int,就不可能抛出异常。
任意拷贝构造函数是否会抛出异常,其实只是一般问题的特例,有函数会抛出异常吗?
如您所料,这完全取决于它调用的其他函数的作用。如果它们中的任何一个使用 throw 或执行一些抛出异常的特殊行为,可能是实现定义的,那么它可能会抛出异常。否则不行。
我在 Herb Sutter 的书中看到复制构造函数可能会抛出异常。
我的第一个问题是复制构造函数是否总是会抛出异常?
我的第二个问题是,如果一个拷贝构造函数不使用new运算符和拷贝构造函数内部的其他函数,是否还有可能出现异常?
除了析构函数和 main
之外的任何 C++ 函数理论上都可以抛出异常,这取决于程序员编写的内容。
并不是所有的拷贝构造函数都会抛出异常。例如,任何 "Plain Old Data" 或 "standard layout" structs/classes 默认情况下都有永远不会抛出的复制构造函数。然而,大多数值得讨论的 classes 包含 map
或 vector
或 string
,所有这些都有可能抛出 std::bad_alloc
的复制构造函数.
struct person {
char name[20];
int id;
int height;
};
到目前为止,std::bad_alloc
是复制构造函数中最常见的异常,但任何异常都是可能的。要找出复制可能引发的异常,您必须查看特定 class 的规范。
如果 "do an exception" 你的意思是它可能会抛出异常,那么不会。并非每个复制构造函数都这样做。如果class只包含一个int,复制构造函数只是复制int,就不可能抛出异常。
任意拷贝构造函数是否会抛出异常,其实只是一般问题的特例,有函数会抛出异常吗?
如您所料,这完全取决于它调用的其他函数的作用。如果它们中的任何一个使用 throw 或执行一些抛出异常的特殊行为,可能是实现定义的,那么它可能会抛出异常。否则不行。