C++中char*与std::byte*之间reinterpret_cast的合法性问询
结论前置
你提到的两类转换场景均符合C++标准要求,不存在未定义行为。
具体规则说明
C++类型别名规则中有明确的豁免条款:允许通过 char*、unsigned char*、std::byte* 三类指针访问任意对象的底层字节表示,你提到的所有场景均符合该条款要求。
第一个代码示例合法性
std::vector<std::byte> vec = {std::byte{'a'}, std::byte{'b'}}; auto sv = std::string_view(reinterpret_cast<char*>(vec.data()), vec.size()); std::cout << sv << '\n';
以上代码完全合法:
std::byte的底层实现为unsigned char类型,属于规则允许的别名访问类型范畴- 转换得到的
char*指针仅用于读取底层字节内容,完全符合类型别名规则要求,不存在UB
三类指针互转的合法性
char*、unsigned char*、std::byte* 之间的 reinterpret_cast 本身始终合法,只要后续通过转换后指针的操作符合类型别名规则即可。唯一的违规场景是:你通过转换后的非const指针修改了原本带有const限定的原对象,这种场景才会触发UB。
带cv限定的转换合法性
你提到的规则理解完全正确,类型别名规则允许别名类型是原动态类型带const、volatile限定的对应变体,你给出的第二个示例:
std::array<char, 2> arr = {'a', 'b'}; auto* p = reinterpret_cast<const std::byte*>(arr.data());
是完全合法的,转换过程中添加const限定符符合标准要求,没有任何合规风险。
内容的提问来源于stack exchange,提问作者Rudolf Lovrenčić
相关产品推荐
相关产品推荐

