【发布时间】:2020-03-28 20:20:55
【问题描述】:
我有一个预先声明的枚举:
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 和非 constexpr 在同一时间。 目前,如果我添加(不是 constexpr):
inline TheEnum operator|(TheEnum const a, TheEnum const b)
{
return TheEnum(std::uint32_t(a) | std::uint32_t(b));
}
我的编译器说它已经定义好了。 constexpr 允许我做一些 typetrait 操作,但我需要相同的操作符来进行运行时评估。
【问题讨论】:
-
你为什么要定义两个相同的运算符?
-
所有
constexpr函数都可以在运行时使用。 -
([dcl.constexpr],C++11 标准中的第 7.1.5/2 节):“constexpr 函数和 constexpr 构造函数是隐式内联的 (7.1.2)。”