9

C ++ 11は、より強力な型の列挙型である列挙型クラスを追加します。列挙型クラスの値は、他の列挙型クラスまたは整数の値に暗黙的に変換されません。また、明示的なサイズ指定子により、前方宣言が許可されます。

そのような列挙の値をvarargs関数に渡し、標準で定義された動作の範囲内にとどまることが可能ですか?実装定義の動作の範囲内ですか?

4

3 に答える 3

9

はい、できます。5.2.2/7は、任意の列挙型の引数を明示的に許可します。スコープなしの列挙値は整数でプロモートされますが、スコープ付きの列挙( 1つenum class)はそうではありません。

もちろん、関数の実装には注意が必要です。

于 2011-10-16T19:51:25.803 に答える
1

答えは安全だと思います。

VA_ARGS引数はPODである必要がありますが、私が知る限り、これは変更されていません。

理由がわかりません:

enum class foo { bar=1 };

ただし、PODらしさの要件を満たしていません。

于 2011-10-16T19:51:05.400 に答える
0

varargsを使用するときにいくつかの型情報を破棄すると(そのため、POD以外の型には強くお勧めしません)、関数を使用してvarargsのもう一方の端で基になる型を受け取るだけです。デフォルトはですintが、変更できます(例enum class MyEnum : char { ... };

修正済み: varargsは実際にすべての型情報を破棄するわけではなく、PODデータ型を使用する場合は非常に安全です。

于 2011-10-16T19:51:07.037 に答える