鉴于此代码
#include <iostream>
#include <format>
enum class Enum;
constexpr Enum operator~(Enum) { return static_cast<Enum>(5); }
enum class Enum { A = 1, B = ~Enum::A }; // line 8
// ^^^^^^^
int main() {
std::cout << std::format("{} and {}\n",
static_cast<int>(Enum::B), static_cast<int>(~Enum::A));
}
有没有办法告诉编译器不要将Enum::A
第 8 行视为int
,而是视为 type Enum
?换句话说,强制编译器使用自定义的operator~()
. 该程序输出-2 and 5
.
额外的铸造可以完成这项工作:
演示
并不真地
如果要可靠地执行某些自定义逻辑,请将其从运算符中取出到一个 constexpr 命名函数中,该函数接受基础类型,然后将其重用于枚举声明和运算符定义。
不,没有办法告诉编译器这一点。对后面的常量表达式类型的限制在[dcl.enum] p5
=
中列出:int
在您的情况下隐式)。无论如何,
B = ~Enum::A
都是无效的。我也找不到任何使该语法有效的建议。std::to_underlying
最干净的方法是在 C++23 中使用: