gpt4 book ai didi

c++ - noexcept,继承构造函数和实际上完整的不完整类型的无效使用

转载 作者:IT老高 更新时间:2023-10-28 23:17:54 27 4
gpt4 key购买 nike

我不确定这是 GCC 编译器的错误还是 noexcept 的预期行为。
考虑以下示例:

struct B {
B(int) noexcept { }
virtual void f() = 0;
};

struct D: public B {
using B::B;
D() noexcept(noexcept(D{42})): B{42} { }
void f() override { }
};

int main() {
B *b = new D{};
}

如果 noexcept 被移除,它会编译。
无论如何,就像在示例中一样,我从 GCC v5.3.1 中得到了这个错误:

test.cpp:8:31: error: invalid use of incomplete type ‘struct D’
D() noexcept(noexcept(D{42})): B{42} { }
^

据我所知,struct D并不是一个不完整的类型,但是语句中涉及到了继承构造函数,看起来编译器实际上是在考虑基础结构的完整性B 多于D

这是预期的行为还是法律法规?

为了清楚起见:

  • here使用 clang 3.7.1
  • 编译成功
  • here使用 GCC 5.3.0
  • 编译失败

this link GCC 编译器的 bugzilla 以获取更多详细信息。
目前,该错误仍未得到证实。我会尽快更新问题。

最佳答案

您的代码是合法的,即使 GCC 另有声明。对这个看起来很有趣的声明感到冒犯:

D() noexcept(noexcept(D{42}));

最外面的noexceptnoexcept specifier ,声明 D::D() 是 noexcept 当且仅当它的常量表达式参数计算为真。内部 noexceptnoexcept operator它在编译时检查其参数表达式(实际上未计算)是否不引发异常。因为 D::D(int) 是 noexcept(继承自 B),所以这应该是真的。

cppreference.com 明确指出允许在说明符内使用运算符(已添加重点):

The noexcept operator performs a compile-time check that returns true if an expression is declared to not throw any exceptions.

It can be used within a function template's noexcept specifier to declare that the function will throw exceptions for some types but not others.

现在,由于标准的第 9.2.2 节,该类应在 noexcept 说明符内被视为完整(加粗强调):

A class is considered a completely-defined object type (3.9) (or complete type) at the closing } of the class-specifier. Within the class member-specification, the class is regarded as complete within function bodies, default arguments, using-declarations introducing inheriting constructors (12.9), exception-specifications, and brace-or-equal-initializers for non-static data members (including such things in nested classes). Otherwise it is regarded as incomplete within its own class member-specification.

§15.4.1 将异常规范定义为以下语法:

exception-specification:

  • dynamic-exception-specification

  • noexcept-specification

所以 GCC 不应该拒绝你的代码。

关于c++ - noexcept,继承构造函数和实际上完整的不完整类型的无效使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35790350/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com