You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:06:03