为作用域枚举类型调用重载位运算符时可能会返回无效值

问题描述 投票:0回答:1

该代码片段用于记录多个摄像头的状态。我为上述范围枚举重载了几个位运算符。 下面的代码片段运行良好。

虽然我清楚地知道根本不会有溢出问题,但我还是担心

MODULE_ENABLED::MODULE_ENABLED_FRONT_CAMERA|MODULE_ENABLED::MODULE_ENABLED_MIDDLE_CAMERA

的表达

作为所述表达式的结果不是

enum class MODULE_ENABLED
的有效值。背后是否有什么潜在的问题?

我已仔细阅读SOSE上发布的相关问题,但他们没有明确回答我的问题。

#include <iostream>
#include <stdint.h>

enum class MODULE_ENABLED : uint8_t
{
    MODULE_ENABLED_NONE = 0,
    MODULE_ENABLED_FRONT_CAMERA = 1,
    MODULE_ENABLED_MIDDLE_CAMERA = 2,
    MODULE_ENABLED_BACK_CAMERA = 4,
};

MODULE_ENABLED operator|(const MODULE_ENABLED& a, const MODULE_ENABLED& b);
MODULE_ENABLED& operator|=(MODULE_ENABLED& a, const MODULE_ENABLED& b);
MODULE_ENABLED operator&(const MODULE_ENABLED& a, const MODULE_ENABLED& b);
MODULE_ENABLED operator&=(MODULE_ENABLED& a, const MODULE_ENABLED& b);
MODULE_ENABLED operator^(const MODULE_ENABLED& a, const MODULE_ENABLED& b);
MODULE_ENABLED& operator^=(MODULE_ENABLED& a, const MODULE_ENABLED& b);
MODULE_ENABLED operator~(const MODULE_ENABLED& a);


MODULE_ENABLED operator|(const MODULE_ENABLED& a, const MODULE_ENABLED& b)
{
    using MODULE_ENABLED = MODULE_ENABLED;
    
    return static_cast<MODULE_ENABLED>(static_cast<std::underlying_type<MODULE_ENABLED>::type>(a) | static_cast<std::underlying_type<MODULE_ENABLED>::type>(b));
}

MODULE_ENABLED& operator|=(MODULE_ENABLED& a, const MODULE_ENABLED& b)
{
    a=(a|b);
    return a;
}

MODULE_ENABLED operator&(const MODULE_ENABLED& a, const MODULE_ENABLED& b)
{
    using MODULE_ENABLED = MODULE_ENABLED;

    return static_cast<MODULE_ENABLED>(static_cast<std::underlying_type<MODULE_ENABLED>::type>(a) & static_cast<std::underlying_type<MODULE_ENABLED>::type>(b));
}

MODULE_ENABLED operator&=(MODULE_ENABLED& a, const MODULE_ENABLED& b)
{
    a = a&b;
    return a;
}

MODULE_ENABLED operator^(const MODULE_ENABLED& a, const MODULE_ENABLED& b)
{
    using MODULE_ENABLED = MODULE_ENABLED;

    return static_cast<MODULE_ENABLED>(static_cast<std::underlying_type<MODULE_ENABLED>::type>(a) ^ static_cast<std::underlying_type<MODULE_ENABLED>::type>(b));
}

MODULE_ENABLED& operator^=(MODULE_ENABLED& a, const MODULE_ENABLED& b)
{
    a = a ^ b;
    return a;
}

MODULE_ENABLED operator~(const MODULE_ENABLED& a)
{
    using MODULE_ENABLED = MODULE_ENABLED;
    return static_cast<MODULE_ENABLED>(~static_cast<std::underlying_type<MODULE_ENABLED>::type>(a));
}

int main() {
    MODULE_ENABLED status = MODULE_ENABLED::MODULE_ENABLED_FRONT_CAMERA|MODULE_ENABLED::MODULE_ENABLED_MIDDLE_CAMERA;

    std::cout << std::hex << static_cast<int>(status) << std::endl;
    return 0;
}
c++ c++11
1个回答
0
投票

由于上述表达式的结果不是枚举类 MODULE_ENABLED 的有效值

这不是真的,因为不仅仅是命名枚举才是有效值。您确实可以像您一样将位标志组合在一起...这是常见且安全的用法。

© www.soinside.com 2019 - 2024. All rights reserved.