C++ 使用静态_cast时指针指向常量指针的原因

C++ 使用静态_cast时指针指向常量指针的原因,c++,constants,static-cast,C++,Constants,Static Cast,我曾试图解决一本书中的一个练习,但我在静态上失败了。我使用了cstdlib的方法。我必须将函数的参数强制转换为C字符串(const char*)。但我总是收到错误消息:从类型“const void*”到类型“const char**”的static_cast会丢弃限定符 int scmp(const void *s1, const void *s2) { const char *c1 = (static_cast<const char**>(s1)); const c

我曾试图解决一本书中的一个练习,但我在静态上失败了。我使用了cstdlib的方法。我必须将函数的参数强制转换为C字符串(const char*)。但我总是收到错误消息:从类型“const void*”到类型“const char**”的static_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);
int-scmp(常数无效*s1,常数无效*s2){
常量char*c1=(静态_cast(s1));
const char*c2=(静态_cast(s2));
....
}
const char*sfield[]={“一”、“二”、“三”、“四”、“五”};
qsort(斯菲尔德,10,4,scmp);
解决办法如下

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

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

它来自原始指针<代码>静态_cast不能放弃常量限定符。因此,您只能将
void const*
强制转换为
T const*


现在,恰好您的
T
是一个
char常量*
。您可能被原始代码中的引导
const
引入歧途。它不适用于人们认为适用的地方。

比较器参数是指向被比较元素的常量版本的指针。在您的示例中,要比较的元素是
const char*
,因此指向该元素的const的指针是
const char*const*
。因此,代码的正确版本为:

int scmp(const void *s1, const void *s2) 
{
    auto pc1 = static_cast<const char * const *>(s1);
    auto pc2 = static_cast<const char * const *>(s2);

    char const *c1 = *pc1;
    char const *c2 = *pc2;

    return strcmp(c1, c2);  // or whatever
}

同样的模式也适用于非指针的元素(例如整数元素)。

您所说的是正确的,但是OP的问题不在于强制转换应该是
const char*
,而不是
const char**
const char*const*
首先提供指向数组元素的指针。数组包含
chat const*
元素,因此指针必须是
char const*const*
。至于OP的例子,我想他们只是忘记了在初始化本地指针时取消引用强制转换的结果的结果是这样的
std::cout@StoryTeller My bad,没有意识到
qsort
使用空指针调用比较函数(这在实现C函数时很有意义)。谢谢你的澄清。
using ELEMENT_T = const char *;

int scmp(void const *s1, void const *s2) 
{
    auto pc1 = static_cast<ELEMENT_T const *>(s1);
    auto pc2 = static_cast<ELEMENT_T const *>(s2);

    ELEMENT_T c1 = *pc1;
    ELEMENT_T c2 = *pc2;

    return strcmp(c1, c2);  // or whatever
}