http://www.drdobbs.com/cpp/practical-c-error-handling-in-hybrid-env/197003350?pgno=4 http://www.drdobbs.com/cpp/practical-c-error-handling-in-hybrid-env/197003350?pgno=4
在这篇文章中,Herb Sutter 解释说,抛出异常需要异常的副本,因为它是作为临时创建的,因此使用std::auto_ptr
以避免复制开销。鉴于 C++11 中提供了移动语义,这还有必要吗?
我刚刚检查过,标准允许
- 省略将 throw 表达式的操作数指定的对象复制或移动到异常对象中
- 如果您不以其他方式更改程序的含义(即,如果您重新抛出并且后续捕获会突然看到更改的异常对象),则省略将异常对象复制或移动到与异常对象类型相同的 catch 子句变量中由之前的 catch 块更改)。
由于允许这些省略,因此规范requires首先将复制或移动的源视为右值。所以这意味着各个对象will如果可能的话被移动。当然,复制和移动省略仍然是首选。
Update
我被告知,将 catch 子句参数的异常对象初始值设定项作为右值初始值设定项的考虑可能会从标准中删除(因为一般来说,在省略时,不可能在所有情况下检测到程序的行为何时未改变)复制/移动),所以我建议not依靠这一点(上面的第二个项目符号)。
你什么can仍然依赖于将局部变量移动到异常对象中,如下所示throw x;
(上面第一个项目符号)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)