#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]

强烈暗示它将在您的程序中不发生此类混叠的假设下进行优化。

09-10 04:06