为何static_cast转换(1)无效而(2)合法?C++类型转换疑问
C++多级指针的static_cast类型转换问题解析
先看你给出的代码:
int main() { const void* p = NULL; const int** pp = static_cast<const int**>(p); // E0171 无效类型转换 (1) int* const* ppp = static_cast<int* const*>(p); // 无错误 (2) }
两者的差异核心在于const的作用层级和C++static_cast的转换规则:
为什么转换(1)无效
const int**的本质是指向「指向const int的指针」的指针。C++标准明确限制:static_cast不允许将void*直接转换为这类多级指针,原因是这种转换会破坏const安全性。
举个极端例子,如果允许该转换,可能出现以下违反const规则的操作:
const int x = 10; int* p; const int** pp = &p; // 若转换合法,这步可以执行 *pp = &x; // 将指向const int的指针赋值给p(原本是int*) *p = 20; // 通过p修改const变量x,直接违反const正确性
为了避免这种安全漏洞,编译器禁止这类static_cast转换。
为什么转换(2)被允许
int* const*的本质是指向「const的int指针」的指针——这里的const修饰的是指针本身(即这个一级指针不能被修改),而非指针指向的对象。
根据C++规则,static_cast允许将void*转换为指向任何cv-qualified(const/volatile修饰)对象类型的指针。int* const是一个合法的对象类型(指针类型本身属于对象类型),因此void*可以安全转换为int* const*,不会产生const安全问题:
int x = 10; int* const p = &x; int* const* ppp = &p; // *ppp = &y; 这行代码会报错,因为p是const指针,无法被修改 // 整个过程不存在绕过const限制修改对象的风险
内容的提问来源于stack exchange,提问作者SZYoo
相关产品推荐
相关产品推荐

