C++11 增加了枚举类,它们是强类型枚举——枚举类的值不会隐式转换为其他枚举类或整数的值,并且通过显式大小说明符允许前向声明。
是否可以将此类枚举的值传递给可变参数函数并保持标准定义的行为?在实现定义的行为中?
C++11 增加了枚举类,它们是强类型枚举——枚举类的值不会隐式转换为其他枚举类或整数的值,并且通过显式大小说明符允许前向声明。
是否可以将此类枚举的值传递给可变参数函数并保持标准定义的行为?在实现定义的行为中?
是的你可以。5.2.2/7 明确允许任何枚举类型的参数。无范围枚举值是整数提升,但范围枚举(enum class
那些)不是。
当然,你在函数的实现中还是要小心的。
我认为答案是它可以是安全的:
VA_ARGS
要求参数是 POD,据我所知,这并没有改变。
我看不出任何原因:
enum class foo { bar=1 };
虽然不符合 POD 的要求。
当您在使用可变参数时丢弃一些类型信息(这就是为什么强烈反对非 POD 类型使用它的原因),您将使用函数在可变参数的另一端收到基础类型。默认是int
,但你可以改变它(例如enum class MyEnum : char { ... };
)
更正:可变参数确实不会丢弃所有类型信息,如果您使用 POD 数据类型,您应该非常安全。