1. 程式人生 > >【c++11】 enum class: 強型別列舉

【c++11】 enum class: 強型別列舉

#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    // 1、列舉型別的定義:
    // 普通列舉常量作用域提升至外圍(main函式之內)並且可以整型提升
    enum Numbers {One=1, Two, Three};    
    // 強型別列舉常量的作用域僅限於Options型別之內,即{}之內; 並且不進行整型提升
    // "One"雖然同名,但由於作用域不同,並不會名字衝突 
    // 關鍵字:enum class,位置不能交換
    enum class Options {None, One, All=15}; 

    // 2、普通列舉的名字衝突
    {
        enum Numbers {One, Two, Three};    
//      enum Options {None, One, All}; // error! 名字衝突:"One"重定義
//      int i = One;
    }

    // 3、列舉常量的整型提升
    int i = One;        // ok! Numbers's One, i=1
    i += Three;            // ok!
//  i = Options::One;    // error! 強型別列舉常量並不能整型提升
    i = static_cast<int>(Options::One); // ok! i=1

    // 4、列舉變數的定義初始化
    Numbers n;
    n = One;
    n = Numbers::One;
//  n += 1;             // error!
//  n = All;            // error! All不在作用域中,並且型別不匹配
//  n = Options::One;   // error! 試圖賦值Options型別的One,型別不匹配
    Options o;
//  o = One;    // error! 試圖賦值Numbers型別的One,型別不匹配
//  o = All;    // error! Options型別之All不在作用域範圍
    o = Options::One;        // ok! 必須使用作用域操作符來訪問強型別列舉常量
    o = Options::All;        // ok!

    // 5、在判斷語句中的列舉值
    if(One<3){}              // ok!
    if(n==1){}               // ok!
    if(n<Three){}            // ok!
    if(One<Three){}          // ok!
    if(Options::All>Options::One){} // ok! if is true!
    if(o==Options::All){}           // ok! if is true!
//  if(Options::All>10){}    // error!

    // 6、指定列舉類的底層型別(列舉常量型別),預設時至少為int
    enum Enum1: unsigned int{first, second, third};
    enum class Enum2: char{first, second, third};
    enum Enum3: unsigned int{Red=-6, Blue, Yellow}; // warning C4369: “Red”: 列舉數的值“-6”不能表示為“unsigned int”,值是“4294967290”
    std::cout << Red << std::endl;
    enum class Enum4: char{first=10086, second, third}; // warning C4369: “first”: 列舉數的值“10086”不能表示為“char”,值是“102”
//  std::cout << Enum4::second << std::endl; // error! 強型別列舉Enum4沒有此操作,second不是整型
    std::cout << (char)Enum4::second << std::endl;
//  enum class Enum4: double{Red=-6, Blue, Yellow}; //error:!“double”: 列舉的基礎型別非法,不是整型

    return 0;
}