C++17之整数列表初始化枚举

30 篇文章 17 订阅

对于具有固定底层类型的枚举,因为c++ 17可以使用该类型的整数值直接初始化列表。

1. 对于普通枚举类型

制定底层类型的普通枚举可以通过{integer_value}直接初始化:

// unscoped enum with underlying type:
enum MyInt : char { };
MyInt i1{42}; // OK since C++17 (ERROR before C++17)
MyInt i2 = 42; // still ERROR
MyInt i3(42); // still ERROR
MyInt i4 = {42}; // still ERROR
MyInt i5{422}  //error: narrowing conversion of ‘422’ from ‘int’ to ‘char’ [-Wnarrowing]

 

2.对于强枚举类型

// scoped enum with default underlying type:
enum class Salutation { mr, mrs };
Salutation s1{0}; // OK since C++17 (ERROR before C++17)
Salutation s2 = 0; // still ERROR
Salutation s3(0); // still ERROR
Salutation s4 = {0}; // still ERROR
Salutation s5{0xffffffffff};//error: narrowing conversion of ‘1099511627775’ from ‘long int’ to ‘int’ [-Wnarrowing]
 Salutation s6{3};  //std::cout << static_cast<int>(s6);打印3

对于制定底层类型的Salutation,其初始化跟上面介绍的一样。

不管对于普通枚举还是强枚举,通过正确的语法来初始化,如果初始化的值大于枚举底层值的范围,编译会报错的。

对于没有指定底层类型的普通类型不能用整数初始化:

enum Flag { bit1=1, bit2=2, bit3=4 };
Flag f1{0}; // error: invalid conversion from ‘int’ to ‘Flag’ [-fpermissive]

还要注意,列表初始化仍然不允许类型截取,如:

enum MyInt : char { };
MyInt i5{42.2}; //error: narrowing conversion of ‘4.2200000000000003e+1’ from ‘double’ to ‘char’ [-Wnarrowing]

这个特性的目的是通过定义枚举类型映射到现有的整数类型来支持定义新整数类型的技巧,就像这里使用MyInt所做的那样。如果没有该特性,就无法在不强制转换的情况下初始化新对象。事实上,由于c++ 17标准库还提供了std::byte,它使用的就是这个特性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值