枚举类的 C 样式强制转换到基础类型 char 的引用

C-style cast of enum class to reference of underlying type char

本文关键字:类型 char 引用 样式 枚举 转换      更新时间:2023-10-16

这是合法的C++(>=14(,导致char被读取并保存到aCode中吗?

enum class ECode : char { Code1 = 'a' };
std::istream& operator>>(std::istream& aIn, ECode& aCode)
{
return aIn >> (std::underlying_type_t<ECode>&)aCode;
}

我宁愿return aIn >> static_cast<std::underlying_type_t<ECode>&>(aCode)似乎不合法的("不能投射到不相关类型的引用"。

但是,这条非常相似的台词是合法的,并且是我的C式演员表应该相同的:

return aIn >> *static_cast<char*>(static_cast<void*>(&aCode))

正如评论中所指出的,没有严格的别名冲突,因为char可以别名任何类型的。

在实践中,我怀疑任何真正的编译器都会做除了"明显"实现之外的任何事情,即为枚举提供与底层类型相同的大小和表示形式。在这种情况下,您的reinterpret_cast将得到明确定义并按预期运行。

然而,标准(截至C++17(似乎并不能保证这一点。

据我所知,它只指定底层类型的任何值都可以存储在枚举对象中,并且static_cast可以无损地用于底层类型范围内的值。

这里有一个语言律师关于sizeof(ECode) == sizeof(char)是否必须成立的问题,尽管答案似乎说"标准实际上并没有这么说,但他们可能是故意的"。

但即使大小相同,也没有表示保证,例如,位可以以某种不同的顺序存储,并且static_cast转换位。

在 [basic.fundamental] 中,它指定了整数类型的表示形式,它甚至有一个明确的脚注,说明枚举不是整数类型。