首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么空类类型构造函数的异常规范是不抛出的异常规范?

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

Stack Overflow用户
提问于 2020-07-20 13:55:58
回答 1查看 97关注 0票数 0
代码语言:javascript
复制
struct Test{
  Test() = default;  // why the implicitly declared as non-throwing exception specification ?
};

类X的隐式声明复制构造函数将具有以下形式 X::X(const X&)如果每个潜在构造的类类型M(或其数组)的子对象都有一个复制构造函数,其第一个参数为const M&或const volatile &.119,否则,隐式声明的复制构造函数将具有X::X(X&)形式。

根据空洞的真理,类测试的隐式声明复制构造函数是Test::Test(const X&),因为没有任何类类型子对象。

因此,类似于异常规范,

根据下列规则:

类X的隐式声明构造函数或在其第一次声明中默认使用的无任何指定符的构造函数具有潜在抛出异常规范当且仅当以下任何构造都可能抛出:

  • 在构造函数的隐式定义中,由重载解析为类X选择的构造函数,用于初始化可能构造的子对象,或
  • 这种初始化的子表达式,例如默认的参数表达式,或者,
  • 对于默认构造函数,默认成员初始化器。

没有为初始化子对象选择的任何构造函数,也没有初始化的任何子表达式,也没有任何默认的成员初始化器。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-20 14:01:15

我们在这里所拥有的,与其说是形式逻辑的问题,不如说是英语单词的含义。

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

现在,如果我们看一下复制构造函数的情况,它的意思相当于“如果所有的X都有属性Y,那么做事情”。如果集合X是空的,那么所有存在的“它们”实际上都有属性Y,所以条件是真的。

相反,如果“任意X”是空的,那么很明显,由于根本没有“任何X"es,所以该属性不存在”任何X“。所以条件是假的。

如果您对“所有”和“任何”这两个词的解释提出异议,那么看看它们是如何在编程中被其他地方使用的。例如,C++标准库。

  • bitset::all在空集上返回true,而bitset::any对空集返回false。
  • std::all_of在空范围内返回true;std::any_of返回false。

这就是这句话的意思。

此外,请注意,维基百科关于真空真理的文章中的英文示例都使用了"all X是Y“这一短语。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62996973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档