首页 > 解决方案 > 枚举器中的按位运算

问题描述

我需要根据场景将一些额外的数据添加到现有的枚举代码中。作为示例,我有以下代码:

#include <iostream>

enum Permissions {Readable = 0x4, Writable = 0x2, Executable = 0x1};

int main()
{
Permissions perms = static_cast<Permissions>(Executable | static_cast<Permissions>(29));
std::cout << perms  <<  std::endl;
perms &= ~Permissions::Executable;
std::cout << perms  <<  std::endl;
}

起初我试图添加数据,然后提取相同的数据 - 但我得到编译错误:

$ c++ -std=c++11 try67.cpp
try67.cpp: In function 'int main()':
try67.cpp:9:7: error: invalid conversion from 'int' to 'Permissions' [-fpermissive]
 perms &= ~Permissions::Executable;

该方法是否正确,我们如何消除编译错误?

标签: c++c++11

解决方案


该方法是否正确,我们如何消除编译错误?

该方法存在问题。如果您仔细使用变量,则可以使用enum.

线

perms &= ~Permissions::Executable;

相当于

perms = perms & ~Permissions::Executable;

编译器错误的原因是位运算符导致 anint并且您试图将 an 分配int给 anenum而不进行强制转换。

您必须像使用第一个操作一样使用强制转换来消除编译器错误。

perms = static_cast<Permissions>(perms & ~Permissions::Executable);

更新,以回应OP的评论

该值为Readable | Writable0x6它不对应于 中任何标记的值enum。因此,如果您使用:

Permissions p1 = Permissions::Readable;
Permissions p2 = Permissions::Writable;

Permissions p3 = static_cast<Permissions>(p1 | p2);

您将遇到 的值p3与任何已知标记都不匹配的情况。如果您有if/else块或switch语句期望所有类型变量的值是Permissions已知标记之一,您会注意到代码中的意外行为。


推荐阅读