Mic*_*vin 16 c++ exception-handling
inline void my_assert( bool cond, const std::exception &e = my_assert_failed() )
{
if ( !cond )
throw e;
}
Run Code Online (Sandbox Code Playgroud)
该标准确保:
在函数调用(5.2.2)中与引用参数的临时绑定将持续存在,直到包含该调用的完整表达式完成为止.
对于抛出的临时对象:
只要存在针对该异常执行的处理程序,临时就会持续存在.
我可以推断出一个临时的传递来my_assert存活直到catch块结束吗?
从N4296(最终C++ 14之后的初稿)[15.1p3]:
抛出异常copy-initializes(8.5,12.8)一个临时对象,称为异常对象.临时是一个左值,用于初始化匹配处理程序中声明的变量(15.3).
所以你不能假设你的临时"幸存下来".如果抛出,std::exception将调用类型的异常对象的复制构造函数e作为参数.e当控制离开包含调用的完整表达式时my_assert(在正常返回之后或作为堆栈展开的一部分,因为您有条件地抛出异常),绑定的临时将被销毁.
在某些情况下,可以省略异常对象的复制结构,但根据[12.8p31.2],这不是其中之一:
- 在throw-expression(5.17)中,当操作数是非易失性自动对象(函数或catch子句参数除外)的名称时,其范围不会超出最内层封闭try-block的末尾(如果有一个),通过将自动对象直接构造到异常对象中,可以省略从操作数到异常对象(15.1)的复制/移动操作
(强调我的)