【发布时间】:2015-03-09 20:20:22
【问题描述】:
标准N4296::3.3.1/4 [basic.scope.declarative]:
正好一个声明应该声明一个类名或枚举名 那不是 typedef 名称,其他声明都应引用 指向同一个变量或枚举数,或者都指向函数和 功能模板;在这种情况下,类名或枚举名是 隐藏 (3.3.10)。
我知道,如果在同一个声明区域中存在同名的变量/函数声明,则该规则是在讨论隐藏类的名称。但是 exactly one 有点令人困惑。以下命名空间完全有效:
namespace A
{
struct A;
struct A { };
int A;
}
虽然我们两次声明了struct A(一个结构的两个声明和一个变量的一个声明)。怎么了?我在规则中失去了什么?
【问题讨论】:
-
我认为这是为了禁止
struct A { int x; }; enum A { y };之类的东西,但措辞有点过于严格了。 -
您实际上并没有两次声明该结构:“仅由 class-key identifier; 组成的声明要么是在当前范围内重新声明名称,要么是转发将标识符声明为类名。”
-
“仅由 class-key identifier 组成的声明;要么是对当前范围内名称的重新声明,要么是将标识符作为类名的前向声明”是在[class.name]/2.
标签: c++ declaration