在C++ 11中抛出时,异常是否使用移动语义?

Gra*_*eme 18 c++ move-semantics c++11

http://www.drdobbs.com/cpp/practical-c-error-handling-in-hybrid-env/197003350?pgno=4

在本文中,Herb Sutter解释说,抛出异常需要异常的副本,因为它是作为临时创建的,因此使用a std::auto_ptr来绕过副本开销.根据C++ 11中提供的移动语义,这仍然是必要的吗?

Joh*_*itb 15

我刚检查过,标准允许

  • 省略将throw表达式的操作数指定的对象复制或移动到异常对象中
  • 如果不改变程序的含义,则省略异常对象的复制或移动到与异常对象相同类型的catch子句变量中(即,如果您将重新抛出并且后续捕获将突然看到更改的异常对象由前一个catch块改变了).

由于允许这些遗漏,规范要求首先考虑副本的来源或移动为右值.所以这意味着如果可能的话,移动相应的对象.当然,复制和移动省略仍然是第一选择.


更新

我被告知,将catch子句参数的异常对象初始值设定项作为rvalue初始值设定项的考虑可能会从标准中删除(因为通常所有情况都不可能在省略时检测程序的行为何时不变复制/移动),所以我建议不要依赖这个(上面的第二个子弹).

您仍然可以依赖的是将局部变量移动到异常对象中,如throw x;(上面的第一个子弹).