考虑以下代码:
#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++ 中等效吗?
前两个的默认向量在
noexcept
的上下文中是等效的。
这可以从default ctor看出:
隐式声明(或在其第一个声明中默认)的默认构造函数具有异常规范,如动态异常规范(C++17 之前)noexcept 规范(C++17 起)中所述。
所以我们转向noexcept规范:
C++ 中的每个函数要么不抛出,要么可能抛出:
- 潜在抛出的函数是:
- 不带 no except 说明符声明的函数 except for
- 默认构造函数、复制构造函数、移动构造函数在首次声明时隐式声明或默认除非