代码之家  ›  专栏  ›  技术社区  ›  Programmer

枚举器中的位运算[重复]

  •  0
  • Programmer  · 技术社区  · 7 年前

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

    #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;
    

    方法正确吗?我们如何消除编译错误?

    1 回复  |  直到 7 年前
        1
  •  3
  •   R Sahu    7 年前

    方法正确吗?我们如何消除编译错误?

    这种方法有很多问题。如果您仔细处理变量,就可以使用 enum

    线路

    perms &= ~Permissions::Executable;
    

    相当于

    perms = perms & ~Permissions::Executable;
    

    编译器错误的原因是按位运算符导致 int 您正在尝试分配一个 int 到 枚举

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

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

    更新,回应OP的评论

    价值 Readable | Writable 是 0x6 ,它不对应于中任何令牌的值 因此,如果您使用:

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

    您将有一个案例,其中 p3 不匹配任何已知标记。如果你有 if / else 块或 switch 期望类型的所有变量的值的语句 Permissions 作为已知标记之一,您将在代码中注意到意外的行为。