假设有一个使用枚举类的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
)。api.hpp
)。这似乎适用于海湾合作委员会,但一般来说是安全的,还是我玩火(ODR违规等)?
假设两个编译器在其他方面是链接兼容的,那么只有enum vs. enum类才有问题。
答案 0 :(得分:5)
就像ildjarn所说,这是未定义的行为。并且这实际上可能在实际实现上失败的原因是普通的C ++ 03枚举没有固定的底层类型。虽然你的枚举类型总是具有“int”作为其底层类型,但是相应的C ++ 03枚举可能具有“short”作为其底层类型,使得代码不是布局兼容的。
答案 1 :(得分:1)
您将违反One Definition Rule(§3.2/ 5)。结果:未定义的行为。