c++ 此枚举转换有效吗?

kyvafyod  于 2023-03-25  发布在  其他
关注(0)|答案(1)|浏览(97)

在下面的代码中,对于所有可能的u64值,函数fn中的转换是否保证返回u64值?从int-〉enum和返回的转换的用途是触发重载解析以选择特定的int函数。

using u64 = unsigned long; // 64bits

enum class EnumT : u64 {};

void Fn(u64 v) {/*...*/}

void Fn(EnumT e) {
    u64 v = u64(e);  
    // ...
}

int main() {
    u64 e = 1337;
    Fn(EnumT(e));
    return 0;
}
lx0bsm1f

lx0bsm1f1#

是的,这是保证正确工作。
术语:

  • 使用enum structenum class声明的枚举称为限定作用域的枚举
  • 枚举的底层类型是用来表示它的整数类型
  • 每一个有作用域的枚举类型都有一个fixed的底层类型。显式指定底层类型的无作用域枚举也有一个固定的底层类型。没有显式指定底层类型的无作用域枚举仍然有一个底层类型,但它不是固定的。(当枚举没有固定的基础类型时,编译器将选择一个未指定的基础类型,该类型足够大,可以表示所有枚举器值。

具有固定基础类型的枚举可以保存其基础类型的任何值(包括未由其任何枚举器表示的值)。它可以转换为该基础类型,* 反之亦然 *,而不会改变值。这是由标准保证的。

相关问题