如何让编译器在作用域枚举定义中使用自定义重载运算符?
问题解答
为什么当前代码会出现这种行为?
在枚举类的枚举器初始化过程中,已定义的枚举器(比如Enum::A)会被视为其底层整数类型的常量(默认是int),而非Enum类型的实例。因此第8行的~Enum::A会触发内置的位取反运算符,得到-2,而非调用你自定义的operator~(Enum)。
解决方案
显式将Enum::A转换回Enum类型,强制编译器调用自定义的运算符重载。修改第8行代码如下:
enum class Enum { A = 1, B = ~static_cast<Enum>(Enum::A) };
修改后程序输出会变为5 and 5,符合预期。
补充说明
枚举类的枚举器在初始化表达式中本质是底层类型的常量表达式,只有通过显式类型转换,才能将其转为枚举类型实例,从而匹配你自定义的运算符。
内容的提问来源于stack exchange,提问作者Kane
相关产品推荐
相关产品推荐

