我可以使用枚举类值作为变量函数的参数吗?

Can I use enum class values as arguments to varargs functions?

本文关键字:函数 变量 参数 可以使 枚举 我可以      更新时间:2023-10-16

c++ 11增加了枚举类,它们是强类型的枚举——枚举类的值不会隐式地转换为其他枚举类的值或整数,并且通过显式的大小说明符允许前向声明。

是否有可能将这些枚举的值传递给变量函数并保持在标准定义的行为内?在实现定义的行为中?

可以。5.2.2/7明确允许任何枚举类型的参数。无作用域的枚举值是整型提升的,但有作用域的枚举(enum class)不是。

当然,在函数的实现中你仍然需要小心。

我认为答案是它可以是安全的:

VA_ARGS要求参数为POD,据我所知,这并没有改变。

我不明白为什么:

enum class foo { bar=1 };

不符合POD-ness的要求

当您在使用可变参数时丢弃了一些类型信息(这就是为什么强烈不鼓励使用非POD类型),您将只在使用函数的可变参数的另一端接收底层类型。默认为int,但您可以更改它(例如enum class MyEnum : char { ... };)

更正: varargs确实不会丢弃所有类型信息,如果您使用POD数据类型,您应该是相当安全的。