【发布时间】:2014-12-27 03:17:33
【问题描述】:
我试图理解使用嵌套名称说明符定义的枚举。标准说的是N4296:7.2/4 [dcl.enum]:
如果枚举键后跟一个嵌套名称说明符,则 enum-specifier 应引用以前的枚举 直接在类或命名空间中声明 嵌套名称说明符指的是(即既不继承也不引入 通过 using-declaration),并且枚举说明符应出现在 包含先前声明的命名空间。
那么,为什么下面的例子有效呢?
#include <iostream>
namespace A
{
namespace B
{
enum E : int;
}
}
namespace C
{
using A::B::E;
}
enum C::E : int { x = 2 };
int main()
{
}
在namescape C中,我们使用声明来声明enum E,然后用枚举定义引用它。编译器可能抛出了一个错误,但它没有。哪里错了,哪里误会了?
【问题讨论】:
-
看起来你发现了一个编译器错误。
-
@T.C.所以,一般来说下面的代码不应该工作太coliru.stacked-crooked.com/a/b4e682437a639a1b 对吧?
-
@T.C.你不能举个继承的例子吗?
-
在您的第二组代码中,
E不是 nested-name-specifier 因此您引用的段落不适用。全局范围定义实际上定义了::E,这是一个与A::B::E不同的枚举。 3.3.1 [basic.scope.declarative]/p4 不允许将其与 using-declaration 结合使用。 (如果您尝试使用E或尝试将x分配给A::B::E类型的变量,则会出现歧义错误,尽管编译器应该在没有这个的情况下诊断它。)至于继承,coliru.stacked-crooked.com/a/80cd6f3dd5127b35 . @nbro 我很确定我知道我在说什么,非常感谢。 -
@T.C.什么,你删除了我的评论?