使用 static_cast 时指向常量指针的原因
reason for pointer to a const pointer when using static_cast
我试图从一本书中解决一个练习,但我在static_cast上失败了。我使用了cstdlib的qsort方法。我必须将函数的参数转换为 C 字符串(常量字符*(。但我总是收到错误消息:从类型"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));
最后一个常量的原因是什么,它来自哪里?为什么我必须投射到指向 char const 的常量指针的指针?
它来自源指针。static_cast
不得丢弃常量限定符。所以你只能把void const*
投到T const*
.
现在,碰巧您的T
是char const*
。您可能被原始代码中的领先const
引入歧途。它不适用于人们可能认为适用的地方。
比较器参数qsort
指向要比较的元素的常量版本的指针。在您的示例中,要比较的元素是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
}
如果您愿意,您可以取消pc1
、pc2
并将*
运算符应用于强制转换的结果。
也许您错误地认为参数是要比较的元素,而实际上它们是指向要比较的元素的指针。
如果仍然不清楚,那么为元素类型使用符号名称可能会有所帮助:
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
}
相同的模式也适用于不是指针的元素(例如整数元素(。
相关文章:
- 将常量指针引用绑定到非常量指针
- 如何使用数据对象上的常量指针初始化类
- C++中的指针和常量问题不大
- 为什么我收到"从常量指针到指针的转换无效?
- 当成员值从指针更改为非指针时,C++常量问题
- 使用双指针传递 2D 常量数组
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 初始化指针的常量向量
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 无法将"常量指针常量"传递给常量引用
- C++:如何创建一个临时对象,包含一个指针 - 常量或非常量,具体取决于上下文
- 具有函数指针常量数组的 C++ 模板化静态类
- 这个constexpr整数不是空指针常量吗
- 使指针常量C++
- C++11在stl容器中共享指针常量
- 空指针常量转换为右值
- 在参考 (T&) 和常量指针 (T* 常量) 之间进行选择