我不确定这是否是一个错误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{};
}
If the 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 http://goo.gl/LzWlya编译成功使用铿锵3.7.1
-
here http://goo.gl/OxkUvU编译失败使用海湾合作委员会5.3.0
See 这个链接 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70077 to the bugzilla有关 GCC 编译器的更多详细信息。
目前,该漏洞尚未得到证实。我会尽快更新问题。
您的代码是合法的,即使 GCC 另有声明。它对这个看起来滑稽的声明感到愤怒:
D() noexcept(noexcept(D{42}));
最外面的noexcept
is a 无例外说明符 http://en.cppreference.com/w/cpp/language/noexcept_spec, 说明D::D()
当且仅当其常量表达式参数计算结果为 true 时,才为 noexcept。内部noexcept
is a 无例外运算符 http://en.cppreference.com/w/cpp/language/noexcept它在编译时检查其参数表达式(实际上未计算)是否抛出异常。因为D::D(int)
是noexcept(继承自B),这应该是真的。
cppreference.com 明确指出允许在说明符内使用运算符(添加了强调):
noexcept 运算符执行编译时检查,如果声明表达式不引发任何异常,则返回 true。
它可以在函数模板的 noexcept 说明符中使用,以声明该函数将引发某些类型的异常,但不会引发其他类型的异常。
现在,应该考虑类complete根据标准第 §9.2.2 条,在 noexcept 说明符内(添加粗体强调):
类在结束时被视为完全定义的对象类型 (3.9)(或完整类型)}
of the 类说明符. 班级内会员规范,该类被认为是完整的函数体、默认参数、使用声明引入继承构造函数(12.9),异常规范s, and 大括号或等于初始化器s 用于非静态数据成员(包括嵌套类中的此类内容)。否则在自己的类中被认为是不完整的会员规范.
§15.4.1 定义了异常规范如以下语法:
异常规范:
所以 GCC 不应该拒绝你的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)