使用move构造函数引发异常?(C ++)

麻雀鹰

如果我有一个实现了move构造函数e的类型的对象Error,将std::move( e )使用的move构造函数Error抛出“ duplicate” e,那么它会避免制作该对象的实际副本吗?所以如果我有

Error e;

throw std::move( e );

的副本构造函数是否Error被调用?当您的move构造函数为noexcept(应该如此)而您的copy构造函数为不是时,这是很有意思的

皮特·斯科特尼克

第15.1节[投掷除外]:

  1. 引发异常将副本复制(初始化为8.5,12.8)一个临时对象,称为异常对象。临时变量是一个左值,用于初始化在匹配处理程序中命名的变量。

  2. 当抛出的对象是一个类对象时,即使省略了复制/移动操作,也可以访问为复制初始化选择的构造函数和析构函数(12.8)。

第8.5节[dcl.init]:

  1. 初始化形式

    T x = a;

,以及参数传递,函数返回,引发异常(15.1),处理异常(15.3)和聚合成员初始化(8.5.1)的过程称为复制初始化[注意:复制初始化可能会调用移动(12.8)。—尾注]

第12.8节[class.copy]:

  1. 当满足或将要执行复制操作的省略标准时,除非源对象是函数参数,并且要复制的对象由左值指定,选择重载构造函数的重载分辨率为首先执行,就好像该对象是由右值指定的

前述的复制删除标准包括以下内容(第12.8节[class.copy] / p31):

  • throw-expression中,当操作数是非易失性自动对象(函数或catch子句参数除外)的名称时,其作用域不超出最里面的try块的末尾(如果有) ),可以通过将自动对象直接构造为异常对象来省略从操作数到异常对象(15.1)的复制/移动操作

异常的复制初始化可能会调用move构造函数来构造实际的异常对象(即使std::move(e)未在throw表达式中显式调用),但也不会构造其匹配处理程序(如果试图被值捕获)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++类构造函数引发异常

来自分类Dev

在构造函数C ++中引发异常

来自分类Dev

在构造函数C ++中引发异常

来自分类Dev

引发异常时不调用Move构造函数

来自分类Dev

当构造函数引发异常并使用自定义new时,C ++如何释放内存

来自分类Dev

当构造函数引发异常并使用自定义new时,C ++如何释放内存

来自分类Dev

使用cython从C ++构造函数传播异常

来自分类Dev

尝试使用C ++ Move构造函数...失败

来自分类Dev

尝试使用C ++ Move构造函数...失败

来自分类Dev

Delphi在构造函数中引发异常

来自分类Dev

在对象构造函数中引发异常

来自分类Dev

从属性构造函数引发异常

来自分类Dev

从匿名内部类的构造函数引发异常

来自分类Dev

反射性地调用引发异常的构造函数

来自分类Dev

我应该在哪里捕获构造函数中引发的C ++异常?

来自分类Dev

使用function-try-block从构造函数中引发两次异常

来自分类Dev

C ++,处理构造函数的异常

来自分类Dev

C ++重载异常的构造函数

来自分类Dev

默认构造函数无法处理异常类型隐式超级构造函数引发的异常

来自分类Dev

Java构造函数引发异常的类的子类化

来自分类Dev

构造函数中引发的异常的处理程序是什么?

来自分类Dev

获取对其构造函数已引发异常的实例的引用

来自分类Dev

无法捕获由std :: thread构造函数引发的异常

来自分类Dev

StructureMap认为它必须注入构造函数并引发异常

来自分类Dev

YamlDotNet序列化程序构造函数引发异常

来自分类Dev

如果禁用了异常,std :: vector <T>是否可以使用T的move构造函数?

来自分类Dev

默认构造函数无法处理隐式超级构造函数引发的异常类型SocketException

来自分类Dev

Visual Studio 2010-构造函数在运行时使用Boolean.Parse引发格式异常-

来自分类Dev

如何禁止复制构造函数并仅使用move构造函数?

Related 相关文章

  1. 1

    C ++类构造函数引发异常

  2. 2

    在构造函数C ++中引发异常

  3. 3

    在构造函数C ++中引发异常

  4. 4

    引发异常时不调用Move构造函数

  5. 5

    当构造函数引发异常并使用自定义new时,C ++如何释放内存

  6. 6

    当构造函数引发异常并使用自定义new时,C ++如何释放内存

  7. 7

    使用cython从C ++构造函数传播异常

  8. 8

    尝试使用C ++ Move构造函数...失败

  9. 9

    尝试使用C ++ Move构造函数...失败

  10. 10

    Delphi在构造函数中引发异常

  11. 11

    在对象构造函数中引发异常

  12. 12

    从属性构造函数引发异常

  13. 13

    从匿名内部类的构造函数引发异常

  14. 14

    反射性地调用引发异常的构造函数

  15. 15

    我应该在哪里捕获构造函数中引发的C ++异常?

  16. 16

    使用function-try-block从构造函数中引发两次异常

  17. 17

    C ++,处理构造函数的异常

  18. 18

    C ++重载异常的构造函数

  19. 19

    默认构造函数无法处理异常类型隐式超级构造函数引发的异常

  20. 20

    Java构造函数引发异常的类的子类化

  21. 21

    构造函数中引发的异常的处理程序是什么?

  22. 22

    获取对其构造函数已引发异常的实例的引用

  23. 23

    无法捕获由std :: thread构造函数引发的异常

  24. 24

    StructureMap认为它必须注入构造函数并引发异常

  25. 25

    YamlDotNet序列化程序构造函数引发异常

  26. 26

    如果禁用了异常,std :: vector <T>是否可以使用T的move构造函数?

  27. 27

    默认构造函数无法处理隐式超级构造函数引发的异常类型SocketException

  28. 28

    Visual Studio 2010-构造函数在运行时使用Boolean.Parse引发格式异常-

  29. 29

    如何禁止复制构造函数并仅使用move构造函数?

热门标签

归档