R. *_*des 8 c++ optimization exception copy-elision
考虑一个带有副作用的复制构造函数的异常类.
编译器是否可以跳过调用复制构造函数:
try {
throw ugly_exception();
}
catch(ugly_exception) // ignoring the exception, so I'm not naming it
{ }
Run Code Online (Sandbox Code Playgroud)
那这个呢:
try {
something_that_throws_ugly_exception();
}
catch(ugly_exception) // ignoring the exception, so I'm not naming it
{ }
Run Code Online (Sandbox Code Playgroud)
(是的,我知道这一切都非常难看,这是受到另一个问题的启发)
是的,它可以在投掷和捕捉期间省略.对于捕获,只有当catch子句中指定的类型与异常对象的类型相同(保存为cv-qualifications)时,才能省略它.有关更正式和详细的说明,请参阅C++ 11 12.8/31.
......在下列情况下允许复制/移动操作(称为复制省略)的这种省略(可以合并以消除多个副本):
...
- 在throw-expression中,当操作数是非易失性自动对象(函数或catch子句参数除外)的名称时,其范围不会超出最内层封闭try-block的末尾(如果有的话) ),通过将自动对象直接构造到异常对象中,可以省略从操作数到异常对象(15.1)的复制/移动操作
...
- 当异常处理程序的异常声明(第15节)声明一个相同类型的对象(cv-qualification除外)作为异常对象(15.1)时,可以通过将异常声明视为异常声明来省略复制/移动操作如果除了为exception-declaration声明的对象执行构造函数和析构函数之外,程序的含义将保持不变,则为异常对象的别名.
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |