enum:int和enum:const int之间有什么区别吗?

时间:2018-01-06 09:28:31

标签: c++11 enums constants

我刚刚发现gcc和clang ++会让我使用const int作为枚举的基础类型。我想知道这是否具有任何效用,如果出于所有目的,它与基于int的枚举相同。

我认为可能会使枚举实例无法分配,但事实并非如此。 (说实话,我认为它的编译方式与无法创建从const基类型class C2 : const C1{}派生的类

的方式相同)

enum : intenum : 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*。)

2 个答案:

答案 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';
}

https://wandbox.org/permlink/dXLDe80zKhSxglcl