这三个默认构造函数在 C++ 中等效吗?

问题描述 投票:0回答:1

考虑以下代码:

#include <type_traits>

template<typename T>
struct A1 {
    T t;

    // implicitly-declared default constructor
};

template<typename T>
struct A2 {
    T t;

    // explicitly-declared default constructor without noexcept
    A2() = default;
};

template<typename T>
struct A3 {
    T t;

    // explicitly-declared default constructor with noexcept
    A3() noexcept(std::is_nothrow_default_constructible<T>::value) = default;
};

这三个默认构造函数在 C++ 中等效吗?

c++ class standards default-constructor noexcept
1个回答
0
投票

前两个的默认向量在

noexcept
的上下文中是等效的。

这可以从default ctor看出:

隐式声明(或在其第一个声明中默认)的默认构造函数具有异常规范,如动态异常规范(C++17 之前)noexcept 规范(C++17 起)中所述。

所以我们转向noexcept规范

C++ 中的每个函数要么不抛出,要么可能抛出:

  • 潜在抛出的函数是
    • 不带 no except 说明符声明的函数 except for
      • 默认构造函数、复制构造函数、移动构造函数在首次声明时隐式声明或默认除非
© www.soinside.com 2019 - 2024. All rights reserved.