struct Test{
Test() = default; // why the implicitly declared as non-throwing exception specification ?
};
类X的隐式声明的复制构造函数将具有以下形式
x::x(常量x(&C) 如果类类型M(或其数组)的每个潜在构造的子对象都有一个复制构造函数,其第一个参数为常量M&; 或者const volatile m&;。119否则,隐式声明的复制构造函数将具有x::x(X&;)
根据Vacuous truth,类Test的隐式声明的复制构造函数是Test::Test(const X&;)
,因为没有任何类类型子对象。
因此,对于异常规范,
根据以下规则:
类X的隐式声明的构造函数,或者在第一次声明时没有默认的noexcept说明符的构造函数,当且仅当下列任何构造是潜在引发的时,才具有潜在引发的异常规范:
没有选择任何用于初始化子对象的构造函数,没有任何初始化的子表达式,也没有任何默认的成员初始值设定项。
前提条件为false,因此我认为异常规范应该是潜在抛出的,但是为什么默认构造函数具有非抛出的异常规范。 我认为在标准中是不明确的。 如果我误解了,请您解读一下。
再读一遍引用的课文。 它基本上是说,“a
发生当且仅当bcd
”。 由于B,C和D都是false,所以B C D
是false。
因此,a
不会发生。 这里的a
是“有一个潜在的抛出异常规范”。
如果存在一个具有非抛出异常规范的构造函数,则结果为false,但是您找不到具有非抛出异常规范的构造函数。
正文不是这么说的:
如果以下任何构造都可能引发
第一个条件中的构造函数集为零。 如果没有构造,那么它们中的任何一个都不能被“潜在抛出”。
它们之间有什么区别,见class.copy.ctor#7,为什么在这里空虚的真理适用于它?
一个“空洞的真理”是基于被建立的条件而适用的。 它并不是“如果一个集合是空的,那么查看该集合的任何东西都自动为真”。
这里的条件讲的是“以下任何一种”。 这就有区别了。 为了使“任何具有性质Y的X”为真,显然必须有一些X才能使它们中的“任何”具有性质Y。