C++ 枚举重载运算符| constexpr和运行时

C++ 枚举重载运算符| constexpr和运行时,c++,c++11,C++,C++11,我有一个预先声明的枚举: enum class TheEnum : std::uint32_t; 然后是运算符重载: constexpr TheEnum operator|(TheEnum const a, TheEnum const b) { return TheEnum(std::uint32_t(a) | std::uint32_t(b)); } 根据定义: enum class TheEnum : std::uint32_t { A = 1 << 0,

我有一个预先声明的枚举:

enum class TheEnum : std::uint32_t;
然后是运算符重载:

constexpr TheEnum operator|(TheEnum const a, TheEnum const b)
{
    return TheEnum(std::uint32_t(a) | std::uint32_t(b));
}
根据定义:

enum class TheEnum : std::uint32_t
{
    A = 1 << 0,
    B = 1 << 1,
    C = 1 << 2,
    D = 1 << 3,
    Val0 = TheEnum::A | TheEnum::C,
    Val1 = TheEnum::A | TheEnum::D,
    Val2 = TheEnum::B | TheEnum::D
};
我的编译器说它已经被定义了。
constexpr允许我执行一些typetrait操作,但我需要相同的运算符进行运行时计算。

函数上的constexpr意味着可以在编译时对函数进行计算。这并不意味着必须在编译时对其进行评估

您需要声明函数
constexpr
,这对于编译时和运行时都足够了


不能声明仅在
constexpr
和/或
inline
上不同的两个函数。这些说明符不是函数签名的一部分,因此不确定函数的单独重载。无论是否使用它们,都是指同一个实体。

函数上的constexpr意味着可以在编译时对该函数求值。这并不意味着必须在编译时对其进行评估

您需要声明函数
constexpr
,这对于编译时和运行时都足够了


不能声明仅在
constexpr
和/或
inline
上不同的两个函数。这些说明符不是函数签名的一部分,因此不确定函数的单独重载。无论是否使用它们,都是指同一个实体。

为什么要定义两个相同的运算符?所有
constexpr
函数都可以在运行时使用。([dcl.constexpr],§C++11标准中的7.1.5/2):“constexpr函数和constexpr构造函数是隐式内联的(7.1.2)。”为什么要定义两个相同的运算符?所有
constexpr
函数都可以在运行时使用。([dcl.constexpr],§C++11标准中的7.1.5/2):“constexpr函数和constexpr构造函数是隐式内联的(7.1.2)。”谢谢,我不需要双重重载。[修正]谢谢,我不需要双重过载。[固定]
inline TheEnum operator|(TheEnum const a, TheEnum const b)
{
    return TheEnum(std::uint32_t(a) | std::uint32_t(b));
}