gpt4 book ai didi

c++ - 枚举类的C样式强制转换为基础类型char的引用

转载 作者:行者123 更新时间:2023-12-02 10:01:37 26 4
gpt4 key购买 nike

这个合法的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)是否必须保留的问题,存在a language lawyer question here,尽管答案似乎表明“标准实际上并没有这样说,但它们可能是真的”。

但是即使大小相同,也无法保证代表性。这些位可以以不同的顺序存储,并且static_cast转换这些位。

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

关于c++ - 枚举类的C样式强制转换为基础类型char的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62313882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com