【问题标题】:why exception specification of a constructor for empty class type is non-throwing exception specification为什么空类类型的构造函数的异常规范是非抛出异常规范
【发布时间】: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


【解决方案1】:

我们在这里所拥有的不是形式逻辑的问题,而是英语单词的意思。

复制构造函数表单的文本指定“如果每个 X 都具有属性 Y,则执行该操作”。异常说明符的文本说“如果任何 X 具有属性 Y,则执行该操作”。

现在,如果我们看一下复制构造函数的例子,它的意思相当于“如果所有 X 都具有属性 Y,则执行该操作”。好吧,如果集合 X 为空,那么存在的“所有这些”实际上确实具有属性 Y。所以条件为真。

相比之下,如果“any X”为空,那么显然不存在具有该属性的“any X”,因为根本不存在“any X”。所以条件为假。

如果您对“all”和“any”这两个词的这种解释提出质疑,那么请看看它们是如何在编程的其他地方使用的。例如,C++ 标准库。

  • bitset::all 在空集上返回真,而bitset::any 在空集上返回假。

  • std::all_of 在空范围内返回 true; std::any_of 返回 false。

这就是词的意思

另外,请注意,维基百科关于 Vacuous Truth 的文章中的英文示例都使用了“all X are Y”这样的措辞。

【讨论】:

  • @NicoBolas 如果存在具有非抛出异常规范的构造函数,则结果为 false,但是您找不到具有非抛出异常规范的构造函数。那么这将是真的,那就是vacous truth
  • @jackX:我不知道你为什么一直链接到那个页面,好像它意味着什么。文字很清楚它在说什么。只需阅读它
  • @NicoBolas 它们之间有什么区别,请参阅class.copy.ctor#7,如果没有任何类类型或只有标量类型,为什么在这里应用空洞的真理。如何解释它们之间的差异。谢谢
  • @NicoBolas 但是 class.copy.ctor#7 中的句子是 if each potentially constructed subobject of a class type M has the copy constructor of form Y,以您的方式思考,这意味着它必须是一些 subobject of a class type M 才能使用其中的 each拥有Y的财产,对吧?
  • @jackX 我能理解这种困惑。在一般用法中可以使用“任何”代替“全部”,认为这在技术语言中使用会很糟糕(例如“任何人都是哺乳动物”可以用来说“所有人都是哺乳动物”,“任何手机必须关闭”的意思是“所有手机都必须关闭”)。这里使用的形式是“如果这些项目中的任何一个满足属性 P”,它总是意味着“如果这些项目中至少有一个满足 P”或“如果集合中存在满足 P 的元素”,即∃?∈? :?(?)。
猜你喜欢
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 2012-07-30
  • 2011-09-26
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
相关资源
最近更新 更多