如何使默认构造函数在noexcept类之外定义?

虚拟软件公司

我知道标记为的构造函数将尽可能=default“尝试”成为noexcept但是,如果我在类定义它,就noexcept不再是它了,如您从此代码中可以看到的:

#include <iostream>
#include <utility>
#include <type_traits>

struct Bar
{
    Bar() = default;
    Bar(Bar&&) = default; // noexcept
};

struct Foo
{
    Foo() = default;
    Foo(Foo&&);
};
// moving the definition outside makes it noexcept(false)
Foo::Foo(Foo&&) = default; // not noexcept anymore

int main()
{
    Foo foo;
    Bar bar;
    std::cout << std::boolalpha;
    // checks
    std::cout << std::is_nothrow_move_constructible<Bar>::value << std::endl;
    std::cout << std::is_nothrow_move_constructible<Foo>::value << std::endl;
}

我如何=default在类外定义这样的构造函数并使其实现noexceptnoexcept(false)如果在类之外定义了为什么还要构造函数呢?通过智能指针实现PIMPL时会出现此问题

普雷托里亚人

§8.4.2/ 2 [dcl.fct.def.default]中介绍了管理两个示例的异常规范的规则。

......如果一个函数明确拖欠了它的第一个宣言,
-它隐含认为constexpr,如果隐式声明会,
-它隐含认为具有同样的异常规范,如果它已经被隐式声明(15.4)和
-...

Bar的move构造函数是noexcept(true)因为在§15.4/ 14中[except.spec]

隐式声明的特殊成员函数(第12条)应具有异常规范如果f是隐式声明的默认构造函数,复制构造函数,move构造函数,析构函数,复制赋值运算符或移动赋值运算符,则当且仅当函数异常规范直接允许时,其隐式异常规范才指定type-id 的隐式定义调用如果它直接调用的任何函数不允许所有异常,则应允许所有异常;如果它直接调用的每个函数不允许任何异常则应不允许任何异常TTfff

§8.4.2/ 2中的规则不适用于在初始声明后已明确默认的特殊成员函数,但析构函数除外,在第12.4 / 3节中特殊noexcept(true)声明noexcept(false)的析构函数为,除非您声明它或其中之一的析构函数数据成员或基类可以抛出。

因此,除非您指定Foo(Foo&&),否则noexcept(true)假定为noexcept(false)

noexcept在第15.4节中找到了规范添加到声明和以后的显式默认声明中的原因。

3   两个例外的规范兼容的,如果:
-两者都是不抛出(见下文),无论其形式如何,
- ...
4   如果函数的任何声明有异常规范,是不是一个noexcept规格允许所有异常,该函数的所有声明,包括定义和任何明确的专业化,都应具有兼容的异常规范...

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在类体之外定义函数时,c ++派生的构造函数-“无默认构造函数”

来自分类Dev

默认定义的move构造函数的noexcept有哪些规则?

来自分类Dev

如何在类模板之外定义类模板的构造函数模板?

来自分类Dev

如何在另一个文件的类之外定义类构造函数?

来自分类Dev

如何在类模板之外定义类模板的构造函数模板?

来自分类Dev

构造函数中定义的类函数的默认参数

来自分类Dev

STL映射自定义键类[默认构造函数]

来自分类Dev

在类定义之外移动函数

来自分类Dev

如果默认构造函数是超类,则默认构造函数如何实例化对象,而无参数构造函数的主体为空?

来自分类Dev

为什么为派生类定义副本构造函数要求定义基类的默认构造函数?

来自分类Dev

如何创建不可变类的默认构造函数

来自分类Dev

默认情况下继承构造函数noexcept(true)吗?

来自分类Dev

为什么默认noexcept move构造函数被接受?

来自分类Dev

当我有其他构造函数时,如何定义默认构造函数?

来自分类Dev

确定抽象基类的构造函数是否为noexcept?

来自分类Dev

如何定义构造函数?

来自分类Dev

如何定义构造函数?

来自分类Dev

如何在类的构造函数中定义* args

来自分类Dev

如何为扩展Date的类定义构造函数?

来自分类Dev

如何创建其构造函数定义为private的类的对象

来自分类Dev

无法从扩展DialogFragment的类中创建默认构造函数,并且我已经创建了自己的自定义构造函数

来自分类Dev

在仅具有需要参数的已定义构造函数的类中调用默认构造函数(在Java中)

来自分类Dev

如何在构造函数之外访问构造函数值

来自分类Dev

当父类在 C++ 中没有默认构造函数时,如何在继承的类中使用构造函数?

来自分类Dev

Haskell:如何为构造函数定义构造函数类Foldable的实例

来自分类Dev

没有默认构造函数的类的向量

来自分类Dev

模板类和遍历的默认构造函数

来自分类Dev

类文件中的默认构造函数

来自分类Dev

Typescript类仅接受默认构造函数

Related 相关文章

  1. 1

    在类体之外定义函数时,c ++派生的构造函数-“无默认构造函数”

  2. 2

    默认定义的move构造函数的noexcept有哪些规则?

  3. 3

    如何在类模板之外定义类模板的构造函数模板?

  4. 4

    如何在另一个文件的类之外定义类构造函数?

  5. 5

    如何在类模板之外定义类模板的构造函数模板?

  6. 6

    构造函数中定义的类函数的默认参数

  7. 7

    STL映射自定义键类[默认构造函数]

  8. 8

    在类定义之外移动函数

  9. 9

    如果默认构造函数是超类,则默认构造函数如何实例化对象,而无参数构造函数的主体为空?

  10. 10

    为什么为派生类定义副本构造函数要求定义基类的默认构造函数?

  11. 11

    如何创建不可变类的默认构造函数

  12. 12

    默认情况下继承构造函数noexcept(true)吗?

  13. 13

    为什么默认noexcept move构造函数被接受?

  14. 14

    当我有其他构造函数时,如何定义默认构造函数?

  15. 15

    确定抽象基类的构造函数是否为noexcept?

  16. 16

    如何定义构造函数?

  17. 17

    如何定义构造函数?

  18. 18

    如何在类的构造函数中定义* args

  19. 19

    如何为扩展Date的类定义构造函数?

  20. 20

    如何创建其构造函数定义为private的类的对象

  21. 21

    无法从扩展DialogFragment的类中创建默认构造函数,并且我已经创建了自己的自定义构造函数

  22. 22

    在仅具有需要参数的已定义构造函数的类中调用默认构造函数(在Java中)

  23. 23

    如何在构造函数之外访问构造函数值

  24. 24

    当父类在 C++ 中没有默认构造函数时,如何在继承的类中使用构造函数?

  25. 25

    Haskell:如何为构造函数定义构造函数类Foldable的实例

  26. 26

    没有默认构造函数的类的向量

  27. 27

    模板类和遍历的默认构造函数

  28. 28

    类文件中的默认构造函数

  29. 29

    Typescript类仅接受默认构造函数

热门标签

归档