6

假设有一个使用枚举类的 C++11 API:

// 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 等)?

假设这两个编译器在其他方面是链接兼容的,那么只有 enum 与 enum 类有问题。

4

2 回答 2

5

就像 ildjarn 所说,这是未定义的行为。这实际上可能在实际实现中失败的原因是普通的 C++03 枚举没有固定的底层类型。虽然您的枚举类类型始终将“int”作为其基础类型,但相应的 C++03 枚举可能将“short”作为其基础类型,从而使代码与布局不兼容。

于 2012-04-28T09:40:20.273 回答
1

您将违反单一定义规则(§3.2/5)。结果:未定义的行为。

于 2012-04-28T07:54:15.967 回答