const_cast有两个级别指针

时间:2014-12-09 18:43:40

标签: c++ casting const-cast

我想使用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的一部分,我无法控制数据的输入。

1 个答案:

答案 0 :(得分:3)

<强>唐&#39;吨

如果您获得了不可变数据,那么您将获得不可变数据,这就是它的结束!

首先,这是我建议的最大安全性。将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*的目的。)< / p>

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

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个实例。