考虑一个带有带有副作用的复制构造函数的异常类。
编译器可以在这里跳过调用复制构造函数吗:
try {
throw ugly_exception();
}
catch(ugly_exception) // ignoring the exception, so I'm not naming it
{ }
那这个呢:
try {
something_that_throws_ugly_exception();
}
catch(ugly_exception) // ignoring the exception, so I'm not naming it
{ }
(是的,我知道这一切都很丑陋,这是受到启发的另一个问题)
是的,在投掷和接球过程中都可以忽略它。对于捕获来说,只有当 catch 子句中指定的类型与异常对象的类型相同(除了 cv 限定)时,才可以忽略它。有关更正式和详细的描述,请参阅 C++11 12.8/31。
...这种复制/移动操作的省略称为复制省略,在以下情况下是允许的(可以组合起来消除多个副本):
...
- 在 throw 表达式中,当操作数是非易失性自动对象(函数或 catch 子句参数除外)的名称时,其范围不超出最内层封闭 try 块的末尾(如果有一个),通过将自动对象直接构造到异常对象中,可以省略从操作数到异常对象(15.1)的复制/移动操作
...
- 当异常处理程序的异常声明(第 15 条)声明与异常对象(15.1)相同类型(cv 限定除外)的对象时,可以通过将异常声明视为如果除了执行异常声明所声明的对象的构造函数和析构函数之外,程序的含义将保持不变,则为异常对象的别名。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)