在枚举类上使用“reinterpret_cast” - 有效或未定义的行为
Using `reinterpret_cast` on an enum class - valid or undefined behavior?
#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;
}
艾德酮
此代码是否保证始终有效?还是未定义的行为?
标准有点不清楚:
3.10 左值和右值 [基本值]
10 如果程序尝试通过以下类型之一以外的 glvalue 访问对象的存储值,则行为未定义:
[...]
(10.4) -- 与对象的动态类型对应的有符号或无符号类型,
[...]
这可以合法地理解为说与枚举类型对应的有符号或无符号类型是其基础类型,但我认为这意味着仅涵盖通过其其他有符号对应类型访问整数类型,枚举类型的底层类型不算作与该枚举类型对应的(无)符号类型。
至少 GCC 同意这一点:它给出了一个混叠警告
enum E : int { };
int f(E e) { return *(int *) &e; }
警告:取消引用类型双关指针将破坏严格别名规则 [-Wstrict-aliasing]
强烈暗示它将根据程序中没有发生此类混叠的假设进行优化。
相关文章:
- 编译C++时未定义的引用
- vscode g++链路故障:体系结构x86_64的未定义符号
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- c++11评估顺序(未定义的行为)
- 使用mysql c++连接器的未定义引用
- 从python调用openMP共享库时,未定义opnMP函数
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- Cmake 链接问题:未定义对 Button::mousePressEvent(QGraphicsSceneMouseE
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 具有外部"c"和程序集的未定义函数
- 此增量后语句是否会导致未定义的行为?
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在枚举类上使用“reinterpret_cast” - 有效或未定义的行为
- 匿名名称空间在此处导致未定义的引用-在那里有效