class 方法声明符中 noexcept 的行为
Behaviour of noexcept in a class method declarator
以下代码的预期行为是什么?
使用 GCC 时输出为 0,而使用 clang 时输出为 1。
哪一个是正确的?
#include <iostream>
static const bool ne = false;
struct a
{
a() noexcept(ne) {}
static const bool ne = true;
};
int main()
{
std::cout << noexcept(a()) << std::endl;
}
他们都对!这只是格式错误的代码。来自 [basic.class.scope]:
A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in
the completed scope of S. No diagnostic is required for a violation of this rule.
本节还包括示例:
[Example:
typedef int c;
enum { i = 1 };
class X {
char v[i]; // error: i refers to ::i
// but when reevaluated is X::i
int f() { return sizeof(c); } // OK: X::c
char c;
enum { i = 2 };
};
[...]
-end example ]
没有全局范围 ne
,代码是有效的 - 但 gcc 无法编译它,因为 bug 70142(仍未确认)。
以下代码的预期行为是什么?
使用 GCC 时输出为 0,而使用 clang 时输出为 1。
哪一个是正确的?
#include <iostream>
static const bool ne = false;
struct a
{
a() noexcept(ne) {}
static const bool ne = true;
};
int main()
{
std::cout << noexcept(a()) << std::endl;
}
他们都对!这只是格式错误的代码。来自 [basic.class.scope]:
A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in the completed scope of S. No diagnostic is required for a violation of this rule.
本节还包括示例:
[Example:
typedef int c; enum { i = 1 }; class X { char v[i]; // error: i refers to ::i // but when reevaluated is X::i int f() { return sizeof(c); } // OK: X::c char c; enum { i = 2 }; }; [...]
-end example ]
没有全局范围 ne
,代码是有效的 - 但 gcc 无法编译它,因为 bug 70142(仍未确认)。