首页 > 解决方案 > 我不明白 [dcl.enum]/4 与下面突出显示的“封闭枚举说明符”有关的内容

问题描述

[dcl.emum]/4

如果一个enum-head-name包含一个nested-name-specifier,它不应以decltype-specifier开头,并且封闭的 enum-specifier或 opaque-enum-declaration 应引用先前直接在类中声明的枚举或嵌套名称说明符所引用的名称空间,或在该名称空间的内联名称空间集 ([namespace.def]) 的元素中(即,既不是继承也不是由 using 声明引入),以及枚举说明符或opaque-enum-declaration 应出现在包含先前声明的命名空间中。

我相信这一段在某种程度上与下面的简单片段有关。但我不明白上面提到的这个封闭的枚举说明符是什么。请注意,两者S::E::i都是S::ienum -head-name,但这两个表达式不包含enum-specifier

#include <iostream>
struct S
{
    enum E { i = 1 };
};

int main(){
    std::cout << S::E::i << '\n'; 
    std::cout << S::i << '\n';
}

此代码打印

1
1

标签: c++enumslanguage-lawyer

解决方案


我相信这一段在某种程度上与下面的简单片段有关。

它与该片段无关,因为枚举说明符enum E { i = 1 }不包含嵌套名称说明符。

请注意,两者S::E::iS::i以下都是枚举头名称

这些不是枚举头名称。enum-head-names 仅在 enum-heads 内,而 enum-heads 仅在 enum-specifiers 内。这些只是限定ID,它由一个嵌套名称说明符和一个命名枚举器的标识符组成。

一个枚举说明符的示例,其 enum-head-name 确实包含一个嵌套名称说明符,并且引用的规则适用于该说明符:

    struct S
    {
        enum E : int;
//      ^^^^^^^^^^^^          opaque-enum-declaration
    };
    enum S::E : int { i = 1 };
//       ^^^                  nested-name-specifier
//       ^^^^                 enum-head-name
//  ^^^^^^^^^^^^^^^           enum-head
//  ^^^^^^^^^^^^^^^^^^^^^^^^^ enum-specifier

推荐阅读