6

列挙型クラスを使用するC++11APIがあるとします。

// api.hpp
enum class E {A, B, C};
void f(E);
...

// api.cpp
void f(E e)
{
    if (e == E::A)
       ...
}

ここで、このAPIを使用したいとしますが、C++11コンパイラーを持っていません。だから私:

  • 列挙api.hpp型クラスを変更して、通常の列挙型に変更します。
  • api.hpp変更されたものを含み、APIを通常どおりに使用するコードコードを記述します(例:呼び出しf)。
  • このコードをC++11以外のコンパイラでコンパイルし、C ++ 11コンパイラでコンパイルされたAPI実装にリンクします(変更されていないものを使用api.hpp)。

これはGCCで機能するようですが、一般的には安全ですか、それとも私は火遊びをしていますか(ODR違反など)?

2つのコンパイラがリンク互換であると仮定すると、問題となるのはenumクラスとenumクラスだけです。

4

2 に答える 2

5

ildjarnが言っているように、これは未定義の動作です。そして、これが実際の実装で実際に失敗する可能性がある理由は、通常のC++03列挙型には固定の基になる型がないためです。enum-class型の基になる型は常に「int」ですが、対応するC ++ 03列挙型の基になる型は「short」であるため、コードはレイアウト互換ではありません。

于 2012-04-28T09:40:20.273 に答える
1

単一定義規則(§3.2/ 5)に違反することになります。結果:未定義の動作。

于 2012-04-28T07:54:15.967 に答える