为何禁止将int**const通过static_cast转换为const int**const?
C++中static_cast的const限定符转换问题
允许的转换示例
以下转换是被允许的:
int * const p1 = nullptr; auto p2 = static_cast<const int * const &>( p1 );
这里p1是指向int的const指针,被转换为指向const int的const指针的引用。这种转换合法,因为它是在指针指向的最底层类型上添加const限定(将int*转为const int*),外层的const指针属性保持不变,属于C++允许的安全const限定转换——转换后的指针无法通过解引用修改原本不能修改的内容。
被禁止的转换示例
为何以下转换是被禁止的?
int * * const pp1 = nullptr; auto pp2 = static_cast<const int * * const &>( pp1 );
这里pp1是指向int指针的const指针,尝试转换为指向const int指针的const指针的引用。看似只是添加了const限定,但实际上违反了C++类型系统的安全规则:
核心原因:指针的const限定不能跨层级“穿透”
C++仅允许在指针的最底层目标类型上添加const(比如int*→const int*),不允许在中间层级修改const限定后直接转换。具体分析:
int** const pp1的本质是:一个自身不可修改指向的指针,它指向的是int*类型的指针- 目标类型
const int** const &是:一个自身不可修改指向的指针的引用,该指针指向的是const int*类型的指针
如果允许这种转换,会引发const安全漏洞:
const int x = 10; int* p; int** const pp = &p; // 假设允许转换 const int** const& pp_ref = static_cast<const int** const&>(pp); *pp_ref = &x; // 将const int*赋值给*pp_ref,也就是p *p = 20; // 间接修改了const变量x,触发未定义行为
为了避免这种破坏const语义的风险,C++直接禁止了这类跨层级的const限定转换。
内容的提问来源于stack exchange,提问作者tommsch
相关产品推荐
相关产品推荐

