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

How to convert string to const unsigned char* without using reinterpret_cast (modern approach)

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

const std::string& input

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

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

reinterpret_cast<const unsigned char*>(input.c_str()) 

这很好用,但在 clang 中我收到警告:

do not use reinterpret_cast [cppcoreguidelines-pro-type-reinterpret-cast]

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

编辑
显然,联合双关语是 UB,所以 绝对 不要这样做。
(尽管为后代保留答案!)


要严格回答你的问题,可以这样:

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 好吗?应该不是。

What is the correct way to change a string or const char* to const unsigned char*?

正确的方法是使用reinterpret_cast。

如果你想避免reinterpret_cast,那么你必须完全避免指针转换,这只有解决XY问题才有可能。部分选项:

  • 您可以首先使用 std::basic_string<unsigned char>
  • 如果您只需要一个指向 unsigned char 的迭代器而不一定是一个指针,那么您可以使用 std::ranges::views::transform,它对每个元素使用静态转换。
  • 您可以更改期望 unsigned char* 接受 char* 的函数。

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