我刚刚发现gcc和clang ++会让我使用const int
作为枚举的基础类型。我想知道这是否具有任何效用,如果出于所有目的,它与基于int
的枚举相同。
我认为可能会使枚举实例无法分配,但事实并非如此。 (说实话,我认为它的编译方式与无法创建从const基类型class C2 : const C1{}
派生的类
enum : int
和enum : const int
之间是否有任何用处或细微差别? 如果不是,编译器为什么会允许它?
示例:
#include<iostream>
enum A : const int{ // is this the same as enum A : int ?
no = 0,
si
};
int main(){
A a;
a = si; // is asignable
a = no; // twice
std::cout << (int)a << std::endl; // prints '0'
return 0;
}
很有趣,我也可以这样做enum A : volatile int
。
(幸运的是,我无法执行此操作enum A : int&
或enum A : int*
。)
答案 0 :(得分:2)
为了完整起见,这里是相关的标准引用(从C ++ 11到最新草案):
[dcl.enum]#2 枚举类型[...] enum-base的type-specifier-seq应命名为整数类型; 忽略任何cv资格。
其中 type-specifier-seq 是相应语法生成中的基础类型规范。
答案 1 :(得分:1)
似乎没有区别 - 两者的底层类型都是int。这里有一些示例测试程序:
#include <iostream>
#include <type_traits>
enum e1 : int {};
enum e2: const int {};
int main() {
bool e1_type = std::is_same<
const int
,typename std::underlying_type<e1>::type
>::value;
bool e2_type = std::is_same<
const int
,typename std::underlying_type<e2>::type
>::value;
std::cout
<< "underlying type for 'e1' is " << (e1_type?"const":"non-const") << '\n'
<< "underlying type for 'e2' is " << (e2_type?"const":"non-const") << '\n';
}