enum型が宣言されているとき
例)enum enum_color {
red,
green,
blue,
};
enum_color(1)とは何を指すのでしょうか。
また、enum_color(-1)とは何を指すのでしょうか。
御教授下さい。
補足☆使用シーン
・ヘッダファイルにて上記のenum型が宣言されている
・ソースファイル内のとある関数の返り値がenum
例)enum_color func()
{
bool b = func2(); // 適当な関数の返り値
switch(b) {
case true: return enum_color(1); break;
case false: return enum_color(-1); break;
}
}
・・・とこんな感じなのですが。
列挙子の値は明示的に値を設定しない限り、 0 から順に設定されますので、
enum_color(1)
は、enum_color の2番目の値 green になります。
列挙の下限は、設定された一番小さい値(ここでは red == 0)が正ならば 0、(負ならばその値を表せる最小の -2^n+1 になります。)
上限は一番大きい値(ここでは、blue == 2)をあらわせる最小のビット数 2^2 から 1 を引いた 3 になります。
そして、この範囲外の値を変換した場合の結果は定義されていませんので、
enum_color(-1)
が何を指すのかはわかりません。
列挙方 enum は、定義されて名前順に
整数が通常わりあてられます。
>enum_color(1)とは何を指すのでしょうか。
恐らく green
>また、enum_color(-1)とは何を指すのでしょうか。
色が定義されていない状態を表現したいのでしょう。
ポータビリティーがない使い方です。
値を明示的に指定すべきです。
連番なら最初の1つを指定すればあとは+1づつ
増加された値になります。
enum enum_color {
undef = -1,
red = 1,
green = 2,
blue = 3,
};
enum型は本質的にintと同等です。
enum_color(1)やenum_color(-1)はそれぞれ1と-1です。
int i = 1;
を
int i = int(1);
と書くことができるのと同じです。
ただ、C++ではenum型のものも型チェックが行われますので、上記funcで返り値の型がenum_colorとなっている以上、
return 1;
や
return -1;
ではint型の値を返そうとしていると解釈されるためコンパイルエラーとなります。
(enum型の変数はintに暗黙的に変換されますが、int型の変数はenum型には暗黙的に変換されません)
enum宣言してあるのですから、通常は
retutn enum_color::green;
と書きます。数字そのものを記述するのは理解しがたいですね。
enum_color(-1)をどのような意図で使っているのかはわかりませんが、もしエラーを表すものとして使いたいのであれば
enum_color { invalid_color = -1, red, green, blue };
とするなりして
return enum_color::invalid_color;
などとしたほうがプログラムを読む人にとっては意図が明確になりよろしいかと思われます。
<蛇足>
ちなみにswitchで分岐させられるものは仕様上整数型のみです。
(C++のbool型は整数値ではありません)
bool型をswitchに入れると暗黙的にtrueは1に、falseは0に変換され、0と1以外の場合のreturn値が記述されていないので上記コードはコンパイラによっては警告が出るはずです。
素直にif文で分岐するのが良いと思います。
</蛇足>
ご回答ありがとうございます。まとめて開きましたので、こちらにまとめてお礼させていただきます。
皆様おっしゃっているように、enum_color(x)という使い方は一般的ではないようですね。
実際には値を初期化したい場面で使用していたのでおそらく定義されていない値を表すということなんだろうなーという想像はついていたのですが、C++はほぼ無知なので質問させていただきました。
読む人にとって難解なソースは良くないですよね。。。気にとめておきます。
ありがとうございました。〆ます。