c++ - 在 C++11 中抛出异常时是否使用 move 语义?

标签 c++ c++11 move-semantics

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

在这篇文章中,Herb Sutter 解释说抛出异常需要异常的拷贝,因为它是作为临时创建的,因此使用 std::auto_ptr 来绕过复制开销。鉴于 move 语义在 C++11 中可用,这仍然是必要的吗?

最佳答案

我刚查过,标准允许

  • 省略将 throw 表达式的操作数指定的对象复制或 move 到异常对象中
  • 如果您不以其他方式改变程序的含义(即如果您重新抛出并且随后的捕获会突然看到一个由前一个 catch block 更改的异常对象)。

由于允许这些遗漏,规范要求首先将复制或 move 的来源视为右值。所以这意味着如果可能的话,相应的对象被 move 。当然复制和 move 省略仍然是首选。


更新

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

可以仍然依赖的是将局部变量 move 到异常对象中,如throw x;(上面的第一个项目符号)。

关于c++ - 在 C++11 中抛出异常时是否使用 move 语义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12276668/

相关文章:

c++ - 多个源文件可执行文件比单个源文件可执行文件慢

c++ - libboost ASIO。简单的异步客户端服务器

c++ - 有没有Makefile依赖的 "watch"/"monitor"/"guard"程序?

C++11 基本构造函数使用 "using"关键字委托(delegate)/转发到派生类

c++ - 它是如何解析的:使用大括号的init列表构造未命名的临时文件

c++ - std::string 的对象真的可以 move 吗?

c++ - 如何使用 std::optional<T>::emplace 的第二个重载

C++ 位运算 : How to decode/decompress char to int, 并显示正确的字符串?

C++11 - 在构造函数中 move 基本数据类型?

arrays - 在稳定 Rust 中,如何将最小值移出数组,删除其他值?