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的隐式声明构造函数或在其第一次声明中默认使用的无任何指定符的构造函数具有潜在抛出异常规范当且仅当以下任何构造都可能抛出:
没有为初始化子对象选择的任何构造函数,也没有初始化的任何子表达式,也没有任何默认的成员初始化器。
前提条件是假的,因此我认为异常规范应该是潜在的抛出,但是为什么默认的构造函数有非抛出异常规范。我认为标准是不明确的。如果我误解了,请解释一下。
发布于 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“这一短语。
https://stackoverflow.com/questions/62996973
复制相似问题