scoped enum 型の変数はその列挙子以外の値はとれない
いいえ、scoped enum の変数は、underlying type として指定された整数型が取れる値なら全て取れます。
C++仕様ドラフト N3337 (2012-01-16) 7.2 Enumeration declarations の第7段落、および N4750 (2018-05-07) 10.2 Enumeration declarations の第8段落によれば
For enumeration whose underlying type is fixed, the values of the enumeration are the values of the underlying type.
拙訳
underlying type が fixed な列挙型については、その列挙型の値は underlying type の値である。
ということですから、underlying type が取れる値は、すべて取れる解釈するのが自然でしょう。(ちなみに、ここでの fixed とは underlying type が指定されているという意味で、scoped enum については、省略すると int がデフォルトで指定されるので、scoped enum は、すべて fixed です。)
また、仕様ドラフトの static cast の章をみても
A value of integral or enumeration type can be explicitly converted to a complete enumeration type. If the enumeration type has a fixed underlying type, the value is first converted to that type by integral conversion, if necessary, and then to the enumeration type.
拙訳
整数型または列挙型の値は、明示的に列挙型に変換できる。もし、その列挙型が fixed な underlying type を持つならば、変換される値は、必要なら、まず、underlying type に整数型による変換を行った後、さらに目的の列挙型に変換される。
とあり、「列挙子として定義された値に限る」などの制限は言及されていません。
さらに C++ 17 では、列挙型の初期化について、以下のような拡張がなされています。
C++
1enum byte : unsigned char { };
2byte b { 42 }; // C++ 11 ではエラー、C++ 17 では OK
3byte e { -1 }; // C++ 11 でも、 C++ 17 でもエラー
したがって、scoped enum は、列挙子として指定した値以外も取れるはずです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/25 03:59