【发布时间】:2020-11-09 19:09:30
【问题描述】:
struct Test{
Test() = default; // why the implicitly declared as non-throwing exception specification ?
};
类 X 的隐式声明的复制构造函数将具有以下形式
X::X(const X&) 如果类类型 M(或其数组)的每个可能构造的子对象都有一个复制构造函数,其第一个参数的类型为 const M& 或 const volatile M&.119 否则,隐式声明的复制构造函数将具有以下形式 X::X(X&)
根据Vacuous truth,Test类隐式声明的复制构造函数是Test::Test(const X&),因为没有任何类类型子对象。
因此,对于异常规范,
根据以下规则:
类 X 的隐式声明的构造函数,或在其第一个声明中默认没有 noexcept 说明符的构造函数,当且仅当以下任何构造可能抛出异常时,才具有潜在抛出异常规范:
- 在类 X 的构造函数的隐式定义中通过重载决议选择的构造函数来初始化可能构造的子对象,或
- 此类初始化的子表达式,例如默认参数表达式,或者,
- 对于默认构造函数,默认成员初始化器。
没有选择用于初始化子对象的任何构造函数,也没有任何初始化的子表达式,也没有任何默认的成员初始化器。
前提条件为假,因此我认为异常规范应该是潜在抛出的,但是为什么默认构造函数具有非抛出异常规范。我认为标准中并不清楚。如果我误解了,请解释一下。
【问题讨论】:
-
"前提条件为假,因此我认为异常规范应该是潜在抛出" 这不是它所说的。它说只有当其中一个为真时,它才会有一个潜在的抛出规范。因为这些都不是真的,所以它不会有一个潜在的抛出规范。你的逻辑毫无意义。
-
@NicolBolas 如
if a constructor selected by overload resolution in the implicit definition of the constructor for class X to initialize a potentially constructed subobject has a potentially-throwing exception specification,但是没有构造函数可以选择?所以这个命题应该是真的。 -
这毫无意义。如果没有这样的构造函数,那么就不可能有一个被选中的,并且未被选中的不能坚持任何属性。也就是说,该部分中的构造函数集是零。因此 none 是“潜在的抛出”。
标签: c++ c++17 language-lawyer