在C ++ 11时抛出是否异常使用移动语义?(Does an exception use move

2019-09-22 04:19发布

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

在这篇文章中香草萨特解释说,抛出一个异常,需要对异常的副本,因为它是作为一个临时创建的,因此使用的std::auto_ptr ,以避开拷贝开销。 在移动语义的光被提供在C ++ 11是这仍然是必要的?

Answer 1:

我刚才检查,该标准允许

  • 省略了由一抛表达式的操作数指定的对象的复制或移动到所述异常对象
  • 省略了异常对象的拷贝或移动到同类型的异常对象的catch子句变量,如果你不以其他方式更改程序的含义(也就是说,如果你会重新抛出和随后的捕捞量会突然看到一个变化的异常对象由以前的catch程序块改变)。

由于这些遗漏是允许的,该规范要求第一方面的复制或移动作为右值的来源。 因此,这意味着相应的对象如果可能被移动。 当然,复制和移动省音仍允许作为第一选择。


更新

我被告知,catch子句参数作为右值初始化的异常对象初始化的代价可能会被从标准(丢弃,因为一般是不可能适用于所有情况,检测时省略时,程序的行为是不变复制/移动),所以我建议不要依赖于这个(第二颗子弹上图)。

什么,你仍然可以依靠的是一个局部变量的移动进入异常对象,如throw x; (上述的第一子弹)。



Answer 2:

从异常对象移动现在是不是强制性的。

它是C ++ 11的缺陷。 见CWG1493 。



文章来源: Does an exception use move semantics when thrown in C++11?