使用static_cast时指向const指针的原因

问题描述 投票:2回答:2

我试图解决一本书中的一个练习,但在static_cast上失败了。我使用了cstdlib中的qsort方法。我必须将函数的参数转换为C-String(const char *)。但是我总是收到错误消息:从类型'const void *'到类型'const char **'的stattic_cast丢弃了限定符。

int scmp(const void *s1, const void *s2) {
    const char *c1 = (static_cast<const char**>(s1));
    const char *c2 = (static_cast<const char**>(s2));
    ....
}

const char *sfield[] = {"one", "two", "three", "four", "five"};
qsort(sfield, 10, 4, scmp);

解决方法如下

const char *c1 = *(static_cast<const char* const*>(s1));

最后一个常量的原因是什么?它来自哪里?为什么我必须将指针转换为constant指向char const的指针?

c++ const static-cast
2个回答
1
投票

它来自原点指针。 static_cast可能不会丢弃const限定符。因此,您只能将void const*强制转换为T const*

现在,您的T恰好是char const*。您可能会被原始代码中的前导const误入歧途。它不适用于可能认为适用的地方。


0
投票

您真正需要的是一个reinterpret_cast,它将const void *转换为const char *:

int scmp(const void *s1, const void *s2) {
    const char *c1 = (reinterpret_cast<const char*>(s1));
    const char *c2 = (reinterpret_cast<const char*>(s2));
    ....
}

static_cast用于进行类型安全的隐式强制转换,而reinterpret_cast用于将一种类型直接转换为另一种类型,这就是您要在此处进行的操作。

但是,除非您确定肯定会安全,否则请谨慎使用reinterpret_cast从类型强制转换为另一类型是危险的。

© www.soinside.com 2019 - 2024. All rights reserved.