【发布时间】:2019-01-09 10:25:55
【问题描述】:
我有一个 const uint8_t*,我想将它转换为一个 char*,以获得一个需要 char* 的接口。
最简单的方法是使用 C 风格的演员表:
const uint8_t* aptr = &some_buffer;
char* bptr = (char*)aptr;
但是,我们的内部样式指南(基于 Google C++ Style Guide)禁止 C 样式转换。
另一种选择是这个怪物,我觉得它很难读:
char *cptr = reinterpret_cast<char*>(const_cast<uint8_t*>(aptr));
我试过的这些其他选项都编译失败:
char* dptr = reinterpret_cast<char*>(aptr);
char* eptr = const_cast<char*>(aptr);
char* fptr = static_cast<char*>(aptr);
有没有什么方法可以使用 C++ 风格的转换来执行这种转换,而无需嵌套两个单独的转换操作?
【问题讨论】:
-
除非您确定您的
const uint8_t*总是 指向一个非常量 缓冲区,否则这可能会导致未定义行为. -
然后你可以编写一个 const 正确的包装函数并向作者发送补丁:)
-
@SergeyA cppreference 不同意你的观点。您能否提供索赔的来源?它说“const_cast 可以形成一个引用或指向实际引用一个 const 对象的非 const 类型的指针”.
-
有问题的 API 是 STL 的一部分 :( 我正在尝试做这个问题中的要求,但也从 uint8_t 转到 char:stackoverflow.com/questions/13059091/…
-
@KerrickStaley 请显示minimal reproducible example。标准库是完全正确的
const。这意味着,如果您在任何时候认为需要const_cast来使用标准库功能,那么您在某个地方犯了一个大错误。