枚举类的 C 样式强制转换到基础类型 char 的引用
C-style cast of enum class to reference of underlying type char
这是合法的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] 中,它指定了整数类型的表示形式,它甚至有一个明确的脚注,说明枚举不是整数类型。
相关文章:
- 枚举类的 C 样式强制转换到基础类型 char 的引用
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- C++:将模板类型 char 转换为 std::string
- 获取"rw_ssid"中成员"长度"的错误请求,该成员属于非类类型"char*"
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 成员引用基类型 'char' 不是 C++ 中的结构或联合
- 错误:请求成员 .. 是非类类型"char"
- 错误:为"运算符 std::string {aka std::__cxx11::basic_string}"指定的返回类型<char>
- 为什么类型 char 返回不同的值?
- 请求成员 'begin' in 'c' 中,它是非类类型 'char [101]' sort(c.begin(), c
- C++ 类型 "char" 的参数与类型 "const char" 的参数不兼容
- 类型 "const char *" 的参数与类型 "char *" 的参数不兼容
- 类型 "const char*" 的参数与类型 "char*" 的参数不兼容。但是为什么?:(
- 创建进程使用路径时出现错误事件:类型 "char *" 的 E0167 参数与类型 "LPWSTR" 的参数不兼容
- 类型 "const char *" 的默认参数与类型 "char *" 的参数不兼容
- 返回类型 char* 的成员函数返回在 while 循环后包含不同字符串的地址
- 接受类型char的输入的问题
- 错误:无法递增类型 'char [6]' 的值
- "char *" 类型的值不能用于初始化类型 "char" 的实体
- 类型 "char *" 的参数与类型 "LPWSTR" 的参数不兼容