gpt4 book ai didi

c++ - 具有两级指针的 const_cast

转载 作者:行者123 更新时间:2023-11-28 00:21:15 27 4
gpt4 key购买 nike

我想使用 C++ 格式进行此转换,它以 C 方式工作。但是当我尝试使用 C++ 格式时它失败了。

有效!

void req_password(const void *data, size_t datalen)
{
char *password_old = ((char **) data)[0];
char *password_new = ((char **) data)[1];
...
}

失败了

void req_password(const void *data, size_t datalen)
{
char *password_old = (const_cast<char **>(data))[0];
char *password_old = (const_cast<char **>(data))[1];
...
}

错误:

error: invalid const_cast from type 'const void*' to type 'char**'

所以我的疑问是,我如何使用 C++ 方式进行这种转换?

PS:这段代码是API的一部分,我无法控制数据的输入。

最佳答案

不要。

如果您获得的是不可变数据,那么您将获得不可变数据,到此结束!

首先,为了最大程度地确保安全,这是我的建议。将 data 强制转换为其真实类型有点棘手,唉:

void req_password(const void* data, size_t datalen)
{
const char* password_old = (reinterpret_cast<const char* const*>(data)[0]);
const char* password_new = (reinterpret_cast<const char* const*>(data)[1]);
// ...
}

(实际上我在上面添加了一些const,因为这似乎是为了让const void*在第一名。)

但是,如果您真的希望字符串可变,那么这也很好:

void req_password(const void* data, size_t datalen)
{
char* password_old = (reinterpret_cast<char* const*>(data)[0]);
char* password_new = (reinterpret_cast<char* const*>(data)[1]);
// ...
// More obvious when you recall that `const void*` is actually `void const*`;
// So:
// void const*
// becomes:
// char* const*
}

请注意您在这里甚至不需要 const_cast,因为您没有修改data 指向的内容:您是取消引用它并获得它的指针。

当然,理想情况下,data 会指向一个const std::string 实例。

关于c++ - 具有两级指针的 const_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27386459/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com