【问题标题】:Enum introduced by using declaration使用声明引入的枚举
【发布时间】: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()
{ 
}

DEMO

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.什么,你删除了我的评论?

标签: c++ enums


【解决方案1】:

显然,由于您给出的原因,这是一个编译器错误。
有趣的是,Clang 3.5.0 和 GCC 4.9 都接受该程序。

【讨论】:

    猜你喜欢
    • 2010-10-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多