C++ enumはなぜ型変換が発生するのか

enum キーワードによって定義された列挙型の列挙子がコンパイル時に値が決まる定数値として利用できるのはC言語と同じですが、C++11からスコープ付き列挙型という機能が追加され、こちらは enum class のように enum に加えて class (または struct)を付記することで列挙型の名前を使った名前解決を要求し、かつ暗黙の変換を防ぎます。
今回の場合列挙型 enum class A の列挙子は(using 宣言を使わないならば) A::BA::C といった形でしか参照できず、暗黙の変換ができない性質によって(static_castなどによる)明示的な型変換が必要となります。

cpp

1#include <type_traits> // for std::underlying_type (C++11), std::underlying_type_t (C++14)2#include <utility> // for std::to_underlying (C++23)3 4enum class A { B, C };5 6void X() {7 int x0 = static_cast<int>(A::B);8 int x1 = static_cast<std::underlying_type<A>::type>(A::B);9 int x2 = static_cast<std::underlying_type_t<A>>(A::B); // C++1410 int x3 = std::to_underlying(A::B); // C++2311}

付記 : define などによる定数の宣言はプリプロセッサによって処理されるのに対し constexpr 指定された変数や enum の列挙子などは通常の変数などと同じような扱い(同等の翻訳フェーズで処理される)をされるため、「そのまま置き換わる」と考えるべきではないと思われます。

コメントを投稿

0 コメント