我试图解决一本书中的一个练习,但在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的指针?
它来自原点指针。 static_cast
可能不会丢弃const限定符。因此,您只能将void const*
强制转换为T const*
。
现在,您的T
恰好是char const*
。您可能会被原始代码中的前导const
误入歧途。它不适用于可能认为适用的地方。
您真正需要的是一个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从类型强制转换为另一类型是危险的。