首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不使用reinterpret_cast (现代方法)的情况下将字符串转换为const无符号字符*

如何在不使用reinterpret_cast (现代方法)的情况下将字符串转换为const无符号字符*
EN

Stack Overflow用户
提问于 2021-09-08 14:01:47
回答 2查看 1.6K关注 0票数 4

我有变量input类型的const std::string&

代码语言:javascript
运行
复制
const std::string& input

现在我需要将它转换为const unsigned char*,因为这是函数的输入。

现在我有了正确的转换代码:

代码语言:javascript
运行
复制
reinterpret_cast<const unsigned char*>(input.c_str()) 

这很好,但是在clang我收到了一个警告:

代码语言:javascript
运行
复制
do not use reinterpret_cast [cppcoreguidelines-pro-type-reinterpret-cast]

stringconst char*更改为const unsigned char*的正确方法是什么

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-08 14:19:34

将字符串或const *更改为const无符号字符*的正确方法是什么?

正确的方法是使用reinterpret_cast。

如果您想要避免reinterpret_cast,那么必须完全避免指针转换,这只有通过解决XY问题才有可能。一些备选方案:

  • 您可以首先使用std::basic_string<unsigned char>
  • 如果您只需要一个迭代器来进行无符号字符,而不一定需要一个指针,那么您可以使用对每个元素使用静态强制转换的std::ranges::views::transform
  • 您可以更改希望unsigned char*接受char*的函数。H 212f 213

如果您不能更改input的类型,并且确实需要一个unsigned char*,并且仍然必须避免重新解释cast,那么您可以使用transform视图从输入创建std::basic_string<unsigned char>。但是这有潜在的开销,所以考虑一下避免reinterpret_cast是否值得。

票数 4
EN

Stack Overflow用户

发布于 2021-09-08 14:15:12

编辑

显然,键入双关语是UB,所以绝对不会这样做。

(不过,给后人留下答案吧!)

为了严格回答你的问题,有这样的方法:

代码语言:javascript
运行
复制
void foo(const unsigned char* str) {
    std::cout << str << std::endl;
}

int main()
{
    std::string word = "test";
    //foo(word.data()); fails
    union { const char* ccptr; const unsigned char* cucptr; } uword;
    uword.ccptr = word.data();
    foo(uword.cucptr);
}

这比reinterpret_cast好吗?可能不会。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69104539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档