2011-10-16 10 views
9

C++ 11強く型付けされた列挙である列挙クラスを追加 - 列挙クラスの値が暗黙的に他の列挙クラスまたは整数の値に変換されず、前方宣言は、明示的なサイズ指定子によって許可されています。varargs関数の引数としてenumクラスの値を使用できますか?

は、それが機能を可変引数や標準に定義された行動の中にとどまるために、このような列挙型の値を渡すことは可能ですか?実装定義の振る舞いの中で?

+0

+1、私はそれに答えるために、最近のドラフトを見てする必要があります良い質問! – Flexo

答えて

8

はい、できます。 5.2.2/7では、任意の列挙型の引数を明示的に使用できます。スコープのない列挙型の値は整数型ですが、スコープ付き列挙型(enum classのもの)はそうではありません。もちろん

あなたはまだ機能の実装に注意する必要があります。

+1

+1 5.2.2/7のリファレンス - 'enum class'が免除されていればそこにメモがあることは間違いないでしょう。 – Flexo

+1

フェッチされた引数がスコープ付きの列挙値だった場合、 'va_arg'で基底型を使用するのがUBであるのだろうか?それはそうだ。 –

+0

@Johannes:それがUBの原因なら、最初の場所(同じ値表現)で基になる型を指定するという目的を破ることはありませんか? – ildjarn

1

私は答えは、それが安全にできることであると思う:

VA_ARGSは、私の知る限り承知しているよう変更されていないことを、PODする引数が必要です。

私はなぜ何らかの理由で見ることができない。

enum class foo { bar=1 }; 

はしかしPODネスの要件を満たしていないだろうが。可変引数を使用しているときに、いくつかの種類の情報を捨てたよう

0

(それは強く非POD型のため、お勧めだ理由です)あなただけの機能を使用して、可変引数の他端の基になる型を受け取ることになります。デフォルトは、(例えば、enum class MyEnum : char { ... };

修正しintされているが、あなたはそれを変更することができます。可変引数は確かに離れて、すべての型情報をスローしません、あなたはPODを使用する場合は、データを使用すると、非常に安全であるべきと入力します。

+1

これは実際に標準が言うものではありません。すべての型情報が捨てられるわけではありません。 –

+1

'int'は既定でスコープ付き列挙型(これは後で説明します)に対してのみtrueです。 –

+0

@AlanStokes:ありがとう。以前の大胆な声明を修正しようとしました。 – Florian

関連する問題