提问者:小点点

为什么空类类型的构造函数的异常规范是非抛出异常规范


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说明符的构造函数,当且仅当下列任何构造是潜在引发的时,才具有潜在引发的异常规范:

  • 由类X的构造函数的隐式定义中的重载解析选择的构造函数,以初始化可能构造的子对象,或
  • 此类初始化的子表达式,如默认参数表达式或,
  • 对于默认构造函数,默认成员初始值设定项。

没有选择任何用于初始化子对象的构造函数,没有任何初始化的子表达式,也没有任何默认的成员初始值设定项。

前提条件为false,因此我认为异常规范应该是潜在抛出的,但是为什么默认构造函数具有非抛出的异常规范。 我认为在标准中是不明确的。 如果我误解了,请您解读一下。


共1个答案

匿名用户

再读一遍引用的课文。 它基本上是说,“a发生当且仅当bcd”。 由于B,C和D都是false,所以B C D是false。

因此,a不会发生。 这里的a是“有一个潜在的抛出异常规范”。

如果存在一个具有非抛出异常规范的构造函数,则结果为false,但是您找不到具有非抛出异常规范的构造函数。

正文不是这么说的:

如果以下任何构造都可能引发

第一个条件中的构造函数集为零。 如果没有构造,那么它们中的任何一个都不能被“潜在抛出”。

它们之间有什么区别,见class.copy.ctor#7,为什么在这里空虚的真理适用于它?

一个“空洞的真理”是基于被建立的条件而适用的。 它并不是“如果一个集合是空的,那么查看该集合的任何东西都自动为真”。

这里的条件讲的是“以下任何一种”。 这就有区别了。 为了使“任何具有性质Y的X”为真,显然必须有一些X才能使它们中的“任何”具有性质Y。