C ++ 11は、より強力な型の列挙型である列挙型クラスを追加します。列挙型クラスの値は、他の列挙型クラスまたは整数の値に暗黙的に変換されません。また、明示的なサイズ指定子により、前方宣言が許可されます。
そのような列挙の値をvarargs関数に渡し、標準で定義された動作の範囲内にとどまることが可能ですか?実装定義の動作の範囲内ですか?
C ++ 11は、より強力な型の列挙型である列挙型クラスを追加します。列挙型クラスの値は、他の列挙型クラスまたは整数の値に暗黙的に変換されません。また、明示的なサイズ指定子により、前方宣言が許可されます。
そのような列挙の値をvarargs関数に渡し、標準で定義された動作の範囲内にとどまることが可能ですか?実装定義の動作の範囲内ですか?
はい、できます。5.2.2/7は、任意の列挙型の引数を明示的に許可します。スコープなしの列挙値は整数でプロモートされますが、スコープ付きの列挙( 1つenum class
)はそうではありません。
もちろん、関数の実装には注意が必要です。
答えは安全だと思います。
VA_ARGS
引数はPODである必要がありますが、私が知る限り、これは変更されていません。
理由がわかりません:
enum class foo { bar=1 };
ただし、PODらしさの要件を満たしていません。
varargsを使用するときにいくつかの型情報を破棄すると(そのため、POD以外の型には強くお勧めしません)、関数を使用してvarargsのもう一方の端で基になる型を受け取るだけです。デフォルトはですint
が、変更できます(例enum class MyEnum : char { ... };
)
修正済み: varargsは実際にすべての型情報を破棄するわけではなく、PODデータ型を使用する場合は非常に安全です。