C++ 强类型枚举中作用域解析背后的基本原理

C++ 强类型枚举中作用域解析背后的基本原理,c++,enums,c++11,C++,Enums,C++11,在强类型枚举中无条件要求显式范围解析背后的基本原理是什么 N2347解释了与旧式枚举的区别,旧式枚举缺少隐式转换,能够指定存储类型,并且在周围的作用域中没有注入名称(如C++03,它继承了C) 换句话说,写enume1{a,b,c}类似于编写 const int a = 1; const int b = 2; const int c = 3; 鉴于enume1类{a,b,c}与C++11中的类似,类似于 namespace E1 { const int a = 1; const int b =

在强类型枚举中无条件要求显式范围解析背后的基本原理是什么

N2347解释了与旧式枚举的区别,旧式枚举缺少隐式转换,能够指定存储类型,并且在周围的作用域中没有注入名称(如C++03,它继承了C)

换句话说,写
enume1{a,b,c}类似于编写

const int a = 1; const int b = 2; const int c = 3;
鉴于
enume1类{a,b,c}与C++11中的类似,类似于

namespace E1 { const int a = 1; const int b = 2; const int c = 3; }
(不引入名称空间,并且在任何情况下都定义枚举类型)

现在,我通常不明白哪里有歧义,假设有如下示例代码(不会编译):

在某些情况下,我欢迎(可选)显式范围解析来指出发生了什么,但我不理解为什么C++11需要显式范围解析,即使没有可能的方法以另一种方式解释代码

在我看来,期望例如
void foo(e1e)
的含义更像
void foo(使用enum E1;E1 e)(我的语法当然是完全错误的,但你明白了)

以同样在N2347中的
Color
Alert
的“经典”示例为例,我们可以看到红色Alert和红色,红色也可能是不同的数值常量。如果没有强大的类型保证,可以想象,当人们真的想要(例如)在显示器上设置红色时,最终会使用alert numeric常量。或者,通过整数转换和lax函数声明,可以想象有人最终使用类似于
yellow | red
的东西来获得橙色

所有这些都是不可能的,那么我们到底在防御什么呢

foo(a);//不含糊:E1预期,但E1::a可能

表达式的类型必须是已知的。由于
a
作为独立表达式的使用是不明确的,因此
a
在任何地方的使用都是不明确的

您不希望表达式根据其使用的上下文而改变其含义<代码>1+1
的含义始终相同
1+t
如果使用相同的
t
,则始终表示相同的内容。类似地,
a
无论在何处使用,都应该表示相同的内容

< > C++中唯一允许基于其使用的上下文推断源类型的是统一初始化。该标准明确规定“带括号的init list”不是表达式
a
是一个表达式,因此它遵循表达式规则

enum class E1 { a, b, c };
enum class E2 { a, b, c }; // allowed now

void foo(E1 e) { ... }
void bar(E2 e) { ... }
void baz(int e) { ... }

foo(a);   // not ambigious: E1 expected, nothing but E1::a possible
bar(a);   // not ambigious: E2 expected, nothing but E2::a possible
baz(a);   // not ambigious: illegal - no name `a` in global scope

E1 x = a; // not ambigious: E1 expected, nothing but E1::a possible