如何将C++比较函数中的C风格强制转换替换为现代类型转换?
问题原因
转换报错的核心是你没有保留pArg1/pArg2的const限定符:这两个参数本身是const void*类型,C++不允许直接将带const限定的指针转换为不带const的指针类型,你之前写的STUDENT_ASSIGN_HIST_S **没有包含const修饰,因此触发编译错误。
正确写法
优先使用static_cast完成转换,这是void*转其他类型指针的标准安全写法,转换时保留const限定即可:
const STUDENT_ASSIGN_HIST_S* psAssign1 = *static_cast<STUDENT_ASSIGN_HIST_S* const*>(pArg1); const STUDENT_ASSIGN_HIST_S* psAssign2 = *static_cast<STUDENT_ASSIGN_HIST_S* const*>(pArg2);
这里的STUDENT_ASSIGN_HIST_S* const*表示:指向const修饰的STUDENT_ASSIGN_HIST_S*指针的二级指针,和const void*的const语义匹配。
如果你确实需要使用reinterpret_cast,同样要带上const限定:
const STUDENT_ASSIGN_HIST_S* psAssign1 = *reinterpret_cast<STUDENT_ASSIGN_HIST_S* const*>(pArg1);
说明
不推荐使用const_cast主动丢弃const限定,qsort回调参数的const本身是约定回调函数不会修改传入元素,保留const符合语义要求,也更安全。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

