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

时间:2011-10-16 19:41:17

标签: c++ c++11 enums enum-class

C ++ 11添加枚举类,它是更强类型的枚举 - 枚举类的值不会被隐式转换为其他枚举类或整数的值,并且通过显式大小说明符允许前向声明。

是否可以将此类枚举的值传递给varargs函数并保持在标准定义的行为中?在实现定义的行为中?

3 个答案:

答案 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数据类型,则应该非常安全。