2012-04-09 6 views
3
enum color = {blue, black=3, yellow=3}; 

2色の値は3ですが、有効ですか?列挙には異なる値が必要だと思いました。この列挙は有効ですか?そうであれば、なぜですか?

+0

あなたはcase文には、黒と黄色の両方を使用することはできません。 – jacknad

+0

構文エラーがあります。 'enum color = {blue、black = 3、yellow = 3};'、 'color'の後に' = 'を削除してください。 –

+0

これは価値があるため、後方互換性のために列挙値を再利用することは珍しいことではありません。例えば、あなたのライブラリのバージョン1では 'enum color {blue、black、gray};を持ち、バージョン2ではあなたはアメリカの英語のために' enum color {blue、black、グレー、グレー=グレー}; '。 –

答えて

9

許可されているという点で有効です。おそらく良いデザインではないでしょう。

なぜ、私はあなたが探している答えがわからないのですか?許可されていない場合、同じ値を参照する2つの列挙を持つことが理にかなった場合を防ぎます。 (これが意味を成す例を簡単に思い付くことができると確信しています)

だから私ができることを制限するか、通常は重複を望まないので制限があるかの選択であれば、私はそれがそうであるように投票したでしょう。

+0

Qの理由の部分には答えません。ここで回答した部分は、 '-pedantic'を使って与えられたコードをコンパイルするだけでチェックできます。 –

+0

@als:私はデザイナーが何を考えているのか分かりませんが、私の応答は実際に何をしようとしたのですか? –

+0

答えの編集履歴のタイムスタンプとコメントの編集履歴のタイムスタンプを比較すると、私が答えたときのコメントは*「それは許可されているという点では有効ですが、おそらく良いデザインではありません」* *なぜですか?* –

0

フレームワークを開発したとします。このフレームワークではパラメータ化にenumを使用しています

何らかの理由で、以前使用されていた用語に満足できなくなっています。

この用語を置き換えるだけで、既存のソフトウェアが破損する可能性があります。古い用語と新しい用語を提供することを決定しました(少なくとも1回のリリースサイクルで)。

0
#include <iostream> 

using namespace std; 

enum color {blue, black=3, yellow=3}; 

int main() 
{ 

    color a = blue; 
    color b = black; 
    color c = yellow; 
    cout<<a<<endl; 
    cout<<b<<endl; 
    cout<<c<<endl; 


     return 0; 
} 

同じようにするのは良い考えではありません。

2

C++ standard、セクション7.2、パート1では、定数式が整数型または列挙型であることのみが必要です。定数値を区別する必要はありません。これにより、コードをより表現力豊かにすると考えられる場合、定数のエイリアシングに柔軟性がもたらされます。例えば、

enum color {red=1,green=2,blue=3,max_color=3}; 

if (myColor > max_color) {/* report an error *} 

はい、それが有効だ

enum color {red=1,green=2,blue=3}; 

if (myColor > blue) {/* report an error *} 
0

よりも優れています。言語仕様に違反していないからです。以下は、ドラフトN3242から引用されますが、一例で見ることができるように、異なる列挙型に関連付けられている値は、別個のものである必要はない。

The identifiers in an enumerator-list are declared as constants, 
and can appear wherever constants are required. An enumeratordefinition 
with = gives the associated enumerator the value indicated by the 
constant-expression. The constant-expression shall be an integral 
constant expression (5.19). If the first enumerator has no initializer, 
the value of the corresponding constant is zero. An enumerator-definition without 
an initializer gives the enumerator the value obtained by 
increasing the value of the previous enumerator by one. 
[ Example: 
enum { a, b, c=0 }; 
enum { d, e, f=e+2 }; 
defines a, c, and d to be zero, b and e to be 1, and f to be 3. —end example ] 
関連する問題