我有以下代码:
struct S {
// conditional noexcept specification which depends on noexceptness of foo()
void bar() noexcept(noexcept(foo()));
// conditional noexcept specification (true)
void foo() noexcept(true);
};
字符串
Clang拒绝此代码,但GCC允许它(https://godbolt.org/z/nxqa5Tr1x):
<source>:2:34: error: exception specification is not available until end of class definition
2 | void bar() noexcept(noexcept(foo()));
|
型
两个编译器都允许将noexcept(true)
替换为noexcept
。
常见问题
1.为什么noexcept(true)
会失败,而noexcept
却能工作?
1.哪个编译器符合标准,如果有的话?
- 注意事项:这个例子显然是最小的。我的实际用例是,我有一个
clear()
成员函数,只有当clear_impl()
是noexcept
时,它才是noexcept
,在一个自定义容器中。
1条答案
按热度按时间q9rjltbz1#
noexcept
和noexcept(true)
没有理由有不同的行为。1.此问题似乎与CWG问题1360、1397、1890和2335有关。noexcept-specifier 是完整的类上下文。这意味着在 noexcept-specifier 中,
S
是完整的(* 例如,* 您可以看到S
的完整成员列表),但这并不意味着在 noexcept-specifier 中,你可以访问后面的完整类上下文中的信息。在某些完整类上下文中,有些编译器甚至不允许你访问前面的不同类型的完整类上下文中的信息,而且措辞也不够清楚,不能肯定地说这是一个编译器错误。我更详细地解释here。