gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:14:07 28 4
gpt4 key购买 nike

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

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

最佳答案

我刚刚检查过,标准允许

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

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


更新

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

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

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com