MSVC常量枚举类型
MSVC const enum type
const enum Alpha{
X=9,
Y=5,
Z=2
}p;
int main(){
enum Alpha a,b;
a= X;
b= Z;
p = X;
p = Y;
printf("%d",a+b-p);
return 0;
}
为什么MSVC编译器中允许p=X和p=Y?此代码输出6。难道不应该在初始化时分配常量值,然后再也不分配吗?
这是编译器本身的一个错误。故事结束了。
事实上,您的小代码显示了编译器中的两个错误。第一个错误就在这里:
const enum Alpha{
X=9,
Y=5,
Z=2
}p; //declaration of p is ill-formed!
p
的声明格式不正确,因此编译器应该拒绝此代码,因为p
被声明为const
,但未初始化。必须初始化const
标量(和pod(类型才能形成良好的格式:
const Alpha q; //ill-formed (same case is with p in your code)
const Alpha r = X; //well-formed
有关详细和广泛的解释,请参阅:
- 为什么常量变量必须立即初始化
看起来确实是个bug。
首先,全局const
对象在定义时必须初始化,并且默认初始化不是枚举类型的选项。根据C++11标准第8.5/6段:
默认初始化类型为T的对象意味着:
--如果T是一个(可能是cv限定的(类类型(第9条(,则调用T的默认构造函数(并且如果T没有可访问的默认构造函数,则初始化是格式错误的(;
--如果T是数组类型,则默认初始化每个元素;
--否则,不执行初始化。
如果程序调用常量限定类型T的对象的默认初始化,则T应为具有用户提供的默认构造函数的类类型。
其次,初始化后不能分配const
对象。
经过编辑以匹配一致认为这是一个编译器错误。
这是因为编译器错误地认为p的类型是Alpha
而不是const Alpha
。如果您将其重写为
enum Alpha{....
} const p;
编译器会正确地抱怨一个常量没有被初始化。
error C2734: 'p' : const object must be initialized if not extern
error C3892: 'p' : you cannot assign to a variable that is const
如果您指定常数,
enum Alpha{....
} const p = Y;
并删除对p的赋值,一切都按预期编译和工作。
相关文章:
- 在有符号基础类型枚举的位域上溢出
- 在编译时将强类型枚举器转换为其基础类型?
- 如果 int 是"not within the enums range",为什么将 int 转换为强类型枚举会编译?
- 类型枚举的变量不是类型名称
- 强类型枚举的语法实现错误
- 枚举与强类型枚举
- 错误:T没有命名类型-用于使用强类型枚举的专门化
- 如何使用强类型枚举
- QT:将强类型枚举参数传递到插槽
- 在类定义中声明类型(枚举、结构等)会增加代码大小
- Visual Studio 11 (beta) 中的强类型枚举类
- 使用强类型枚举对类型和子类型进行建模
- 不允许将强类型枚举用作同一基础类型的参数
- 如何正确使用C++强类型枚举
- 带有强类型枚举的模板参数推导
- 是否可以在googleprotobuf中为类型(枚举或消息)定义一个别名
- C++中默认初始化的全局强类型枚举是什么
- std::is_signed不适用于强类型枚举:int
- 如何定义自定义值的类型?(枚举类型定义)
- 将强类型枚举传递给函数