【问题标题】:enum overloading operator | constexpr and runtime枚举重载运算符 | constexpr 和运行时
【发布时间】: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)。”

标签: c++ c++11


【解决方案1】:

constexpr 在函数上意味着函数可能在编译时被评估。这并不意味着它必须在编译时进行评估。

你想声明你的函数constexpr,这对于编译时和运行时使用来说已经足够了。

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

【讨论】:

  • 谢谢,我不需要双重超载。 [固定]
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多