C ++ 11添加枚举类,它是更强类型的枚举 - 枚举类的值不会被隐式转换为其他枚举类或整数的值,并且通过显式大小说明符允许前向声明。
是否可以将此类枚举的值传递给varargs函数并保持在标准定义的行为中?在实现定义的行为中?
答案 0 :(得分:8)
是的,你可以。 5.2.2 / 7显式允许任何枚举类型的参数。 unscoped枚举值是整数提升的,但是有范围的枚举(enum class
枚举)不是。
当然,在执行该功能时仍需要小心。
答案 1 :(得分:1)
我认为答案是它可以安全:
VA_ARGS
要求参数为POD,据我所知,这个参数没有改变。
我看不出任何理由:
enum class foo { bar=1 };
虽然不符合POD要求。
答案 2 :(得分:0)
当您使用varargs时丢弃某些类型信息(这就是为什么非强烈建议不使用非POD类型),您只需使用函数在varargs的另一端接收基础类型。默认值为int
,但您可以更改(例如enum class MyEnum : char { ... };
)
已更正: varargs确实不会丢弃所有类型信息,如果您使用POD数据类型,则应该非常安全。