当前位置: 首页 > news >正文

为何推荐首选enum class 而非 enum

首先,我们比较下这两种枚举类型的表示方式上有何差异:

一、异同点

enum class 官方解释

// unscoped enum:
// enum [identifier] [: type] {enum-list};

// scoped enum:
// enum [class|struct] [identifier] [: type] {enum-list};

// Forward declaration of enumerations  (C++11):
enum A : int;          // non-scoped enum must have type specified
enum class B;          // scoped enum defaults to int but ...
enum class C : short;  // ... may have any integral underlying type

总结来说:
1.enum class是类型安全的
2.enum class枚举定义将被限制在枚举作用域内,不能隐式转换为整数类型,但是可以强制转化为整数类型;enum 未区分范围的枚举常量可以隐式转换为 int,但是 int 不可以隐式转换为枚举值。
3.使用enum class必须带作用域名。

二、使用示例

直接贴几个官方的例子,一看便知(说多了也都是废话):

namespace CardGame_Scoped
{
    enum class Suit { Diamonds, Hearts, Clubs, Spades };

    void PlayCard(Suit suit)
    {
        if (suit == Suit::Clubs) // Enumerator must be qualified by enum type
        { /*...*/}
    }
}

namespace CardGame_NonScoped
{
    enum Suit { Diamonds, Hearts, Clubs, Spades };

    void PlayCard(Suit suit)
    {
        if (suit == Clubs) // Enumerator is visible without qualification
        { /*...*/
        }
    }
}
namespace ScopedEnumConversions
{
    enum class Suit { Diamonds, Hearts, Clubs, Spades };

    void AttemptConversions()
    {
        Suit hand;
        hand = Clubs; // error C2065: 'Clubs' : undeclared identifier
        hand = Suit::Clubs; //Correct.
        int account_num = 135692;
        hand = account_num; // error C2440: '=' : cannot convert from 'int' to 'Suit'
        hand = static_cast<Suit>(account_num); // OK, but probably a bug!!!

        account_num = Suit::Hearts; // error C2440: '=' : cannot convert from 'Suit' to 'int'
        account_num = static_cast<int>(Suit::Hearts); // OK
    }
}
enum class byte : unsigned char { };

enum class E : int { };
E e1{ 0 };
E e2 = E{ 0 };

struct X
{
    E e{ 0 };
    X() : e{ 0 } { }
};

E* p = new E{ 0 };

void f(E e) {};

int main()
{
    f(E{ 0 });
    byte i{ 42 };
    byte j = byte{ 42 };

    // unsigned char c = j; // C2440: 'initializing': cannot convert from 'byte' to 'unsigned char'
    return 0;
}

相关文章:

  • 做网站需要学数据库吗/北京网站优化推广方案
  • 松山湖网站建设/泰州seo公司
  • 做网站好赚钱/外贸平台哪个网站最好
  • 桂林网站建设找骏程/秦皇岛seo优化
  • 公司建设网站申请报告/品牌网络推广怎么做
  • 男女做那个视频的网站/seo手机排名软件
  • 红队隧道应用篇之Burpsuite设置上游代理访问内网(五)
  • 逆天了!用Numpy开发深度学习框架,透视神经网络训练过程
  • 渗透攻击MS08-067
  • 2022年全国职业院校技能大赛中职组网络安全竞赛试题B模块 —wirehark数据分析与取证captureWH.pcapng(解析教程)
  • vcpkg踩坑记录
  • Apache Spark 练习五:使用Spark进行YouTube视频网站指标分析
  • 【Javassist】快速入门系列05 当有指定方法调用时替换方法调用的内容
  • RV1126笔记二:rkmedia测试
  • hbuilderx本地调试h5 vue应用的时候,怎么使用https证书?
  • 【小程序】全局配置window和tabBar
  • 【Linux操作系统】——在Ubuntu20.04上安装MySQL数据库
  • 【记录】chmod修改组属性失效问题