c++ - 枚举器中的按位运算
问题描述
我需要根据场景将一些额外的数据添加到现有的枚举代码中。作为示例,我有以下代码:
#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;
该方法是否正确,我们如何消除编译错误?
解决方案
该方法是否正确,我们如何消除编译错误?
该方法存在问题。如果您仔细使用变量,则可以使用enum
.
线
perms &= ~Permissions::Executable;
相当于
perms = perms & ~Permissions::Executable;
编译器错误的原因是位运算符导致 anint
并且您试图将 an 分配int
给 anenum
而不进行强制转换。
您必须像使用第一个操作一样使用强制转换来消除编译器错误。
perms = static_cast<Permissions>(perms & ~Permissions::Executable);
更新,以回应OP的评论
该值为Readable | Writable
,0x6
它不对应于 中任何标记的值enum
。因此,如果您使用:
Permissions p1 = Permissions::Readable;
Permissions p2 = Permissions::Writable;
Permissions p3 = static_cast<Permissions>(p1 | p2);
您将遇到 的值p3
与任何已知标记都不匹配的情况。如果您有if
/else
块或switch
语句期望所有类型变量的值是Permissions
已知标记之一,您会注意到代码中的意外行为。
推荐阅读
- nginx - Nginx 错误日志 - 未初始化的“日志记录”变量
- drools - Drools:如何删除动态创建的 drl?
- google-chrome - Chrome 显示错误的时区
- c - shell脚本是否与C一样“接近硅”?
- python - 如何单击按钮以使用 python 抓取评论
- javascript - 如何从 Axios 将多个动态选项渲染到 React 中的选择框中
- android - 如何从 Android 向外部设备供电?
- docker - Ansible docker_service 模块实际上并没有停止容器/服务
- html - 使用 HTML POST -> API-> Lambda -> s3 上传文件 - Amazon API Gateway p26
- java - 如何使用 Lambda + Java 从 S3 收集文件并将其发送到外部 SFTP?