当前位置: 首页 > 知识库问答 >
问题:

C++11访问具有限定名称的未作用域枚举数

云昊阳
2023-03-14
enum SomeEnum
{
  EnumA,
  ...
};

void foo()
{
  SomeEnum x = SomeEnum::EnumA;
}

我确信这不起作用,并且SomeNum必须是一个枚举类才能实现这种行为,但它确实编译得很干净。

偷看C++11标准,我一开始以为标准和我一致:

§7.2枚举声明:每个枚举名称和每个未作用域枚举数都在直接包含枚举说明符的作用域中声明。每个作用域枚举数都在枚举的作用域中声明。

共有1个答案

魏岳
2023-03-14

您要从C++11标准草案中找到的引语来自5.1Primary expressions一节,该节在第10段中说:

表示枚举(7.2)的nested-name-specifier,后跟该枚举的枚举数的名称,是引用该枚举数的限定ID。结果就是枚举数。结果的类型就是枚举的类型。结果是一个PRVALUE。

它并不限制对范围内枚举的使用,因此7.2节中的枚举声明

enum direction { left='l', right='r' };

void g() {
   direction d; // OK
   d = left; // OK
   d = direction::right; // OK
}

是完全一致的。这也与3.4.3节限定名称查找一致,该节表示:

类或命名空间成员或枚举数的名称可以在应用于表示其类、命名空间或枚举的nested-name-specifier的::scope解析运算符(5.1)之后引用。[...]

和:

 类似资料:
  • 条款10:优先考虑限域枚举而非未限域枚举 通常来说,在花括号中声明一个名字会限制它的作用域在花括号之内。但这对于C++98风格的enum中声明的枚举名是不成立的。这些在enum作用域中声明的枚举名所在的作用域也包括enum本身,也就是说这些枚举名和enum所在的作用域中声明的相同名字没有什么不同 enum Color { black, white, red }; // black, white

  • 枚举类(“新的枚举”/“强类型的枚举”)主要用来解决传统的C++枚举的三个问题: 传统C++枚举会被隐式转换为int,这在那些不应被转换为int的情况下可能导致错误 传统C++枚举的每一枚举值在其作用域范围内都是可见的,容易导致名称冲突(同名冲突) 不可以指定枚举的底层数据类型,这可能会导致代码不容易理解、兼容性问题以及不可以进行前向声明 枚举类(enum)(“强类型枚举”)是强类型的,并且具有类

  • 问题内容: 我想要一个Java枚举,其值是整数。 例如: 但是我也想要这两个常量的自定义名称, 例如“ Task Created”和“ Task Deleted”(那里有空格)。 我想尽可能优雅地做到这一点,而无需编写 太多额外的代码。 我可以在没有其他 将枚举常量映射到其自定义名称的映射的情况下实现此目标吗? 我在该项目中使用JDK 6。 问题答案: 只需为此添加一个字段: 如果您不想指定字符串

  • 在不使用其他映射( 将枚举常量映射到它们的自定义名称)的情况下,我能做到这一点吗? 我在这个项目中使用JDK6。

  • 本文向大家介绍C和C++11之enum枚举的具体使用方法,包括了C和C++11之enum枚举的具体使用方法的使用技巧和注意事项,需要的朋友参考一下 一、前言 由于C++项目中用了相对比较多的枚举(enum),正常情况下,枚举变量都是占用一个整形类型的大小,但是项目中枚举(enum)只需要使用到一个字节的大小,因为是在嵌入式设备上执行的代码,资源比较少,那么如果枚举都是按照int型大小来使用的话,这

  • 问题内容: 通过阅读SCJP书籍,我在第1章“自测”中发现了类似的内容: 注意:代码编译正常。我不明白的是为什么我们可以从变量访问DOG,CAT或FISH常量。我认为(并且也写在书中)DOG,FISH,CAT是常量,其实现方式类似于。 所以,如果它们确实是静态的,为什么我们可以从中访问它们呢?最后一行是我熟悉的方式。 问题答案: 写作 和写作一样。也就是说,编译器将用其编译时类型Animal替换变