#include <iostream>
#include <cassert>
#include <type_traits>
template<typename T> using Underlying = std::underlying_type_t<T>;
enum class ETest : int
{
Zero = 0,
One = 1,
Two = 2
};
template<typename T> auto& castEnum(T& mX) noexcept
{
// `static_cast` does not compile
// return static_cast<Underlying<T>&>(mX);
return reinterpret_cast<Underlying<T>&>(mX);
}
int main()
{
auto x(ETest::Zero);
castEnum(x) = 1;
assert(x == ETest::One);
return 0;
}
ideone
可以保证此代码始终有效吗?还是 undefined 的行为?
最佳答案
该标准尚不清楚:
可以合理地理解为说,与枚举类型相对应的有符号或无符号类型是其底层类型,但是我认为这旨在仅覆盖通过其其他符号对应类型访问整数类型,即整数类型的底层类型。枚举类型不算作与该枚举类型相对应的(无符号)类型。
至少GCC对此表示同意:它会针对
enum E : int { };
int f(E e) { return *(int *) &e; }
警告:取消引用类型化指针会破坏严格混叠规则[-Wstrict-aliasing]强烈暗示它将在您的程序中不发生此类混叠的假设下进行优化。