2

次の C++11 コードが与えられた場合

enum class Foods {
  Apple,
  Pear,
  Banana
};

意思

std::cout << (unsigned int)Foods::Apple << std::endl;

出力 0?

これは MSVC 2012 と gcc 4.7.0 に当てはまりますが、C++11 標準が何に依存するかについてより興味があります。つまり、移植可能なコードは、最初の項目の値をデフォルトで 0 にする列挙型に依存できますか?

4

3 に答える 3

6

標準では、初期化子を指定しない最初の列挙子の値に関して、スコープ付き列挙とスコープなし列挙を区別しません。

§7.2/2 [dcl.enum] より

enum-keyのみで宣言された列挙型はenumスコープなし列挙であり、その列挙子スコープなし列挙子です。enum-keys enum classとはenum struct意味的に同等です。これらのいずれかで宣言された列挙型はスコープ付き列挙であり、その列挙子スコープ付き列挙子です。[...]最初の列挙子に初期化子がない場合、対応する定数の値はゼロです。[...]

于 2012-11-19T23:49:47.707 に答える
5

列挙値の初期化は変更されていません。別の初期値を指定しない限り、それらはゼロから始まり、前の値からカウントアップします。関連するセクションは、7.2 [dcl.enum] パラグラフ 2 にあります。

最初の列挙子に初期化子がない場合、対応する定数の値はゼロです。初期化子のない enumerator-definition は、前の列挙子の値を 1 増やした値を列挙子に与えます。

于 2012-11-19T23:48:01.243 に答える
4

はい、そうです。それは§7.2/2にあります:

[...] 最初の列挙子に初期化子がない場合、対応する定数の値はゼロです。初期化子のない enumerator-definition は、前の列挙子の値を 1 だけ増やした値を列挙子に与えます。

このセクションでは、enum class宣言と通常のenum宣言の両方について説明します

于 2012-11-19T23:49:54.447 に答える