読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

enum classの演算子オーバーロードの見えている地雷

ちょいとenum classの話題が密かに繰り広げられたんでこの前嵌った罠でも晒しておきます。
enum classは整数型に暗黙の型変換が効かないので次のようなコードは通りません。

enum class Hoge {
  foo = 1, bar = 2, huga = 3
};

int main() {
  auto o = Hoge::foo | Hoge::bar;
}

まぁ暗黙の型変換が効かないのでHoge | Hogeに適合する演算子が見つからないわけです。
とはいいつつもC++には演算子オーバーロードという手段があるのでまぁやろうと思えば出来ます。

Hoge operator |(Hoge lhs, Hoge rhs) {
  return lhs | rhs;
}

この超怪しい演算子オーバーロードコンパイル通るんですね。Hoge | Hogeは外では通らないのにオーバーロードの中では空気読んで通してくれるのかと一瞬甘い夢を見てしまいましたがそんなことはありません。これは唯の再帰です。よって実行結果はセグるってやつです。
よって正しくはこんなキャストまみれなコードを書かないといけないことになります。

Hoge operator |(Hoge lhs, Hoge rhs) {
  return static_cast<Hoge>(static_cast<int>(lhs) | static_cast<int>(rhs));
}

まぁこういう演算がしたい場合はそもそもenum classを使うなってことなんでしょう。きっと。