关于C11标准中T*转const T*等隐式转换定义位置的问询
好问题!咱们来逐个解答你关于C11标准中指针隐式转换的疑问:
1. T* 到 const T* 的隐式转换:确实有定义
你提到的T x; const T *p = &x;这种转换,在C11标准里是明确允许的隐式转换,具体定义在6.3.2.3 指针这一节的第2款:
For any qualifier q, a pointer to a non-q-qualified type may be converted to a pointer to the q-qualified version of the type; the values stored in the original and converted pointers shall compare equal.
简单解释就是:对于任何限定符(比如const),指向非限定类型的指针可以被转换为指向该类型带限定符版本的指针,转换前后的指针值是相等的。这也是为什么你写的示例代码可以正常编译——赋值操作会触发这个标准允许的隐式转换,完全符合C11的规定。
2. T** 到 const相关类型的隐式转换:默认不允许
很遗憾,这种转换没有被C11标准允许作为隐式转换。比如你不能直接写:
T** pp; const T** cpp = pp; // 编译报错!
为什么标准要禁止这种转换?核心原因是类型安全。举个具体的反例就能明白:
const int c = 10; int *p; const int **cpp = &p; // 如果允许隐式转换 *cpp = &c; // 现在p指向了const int对象 *p = 20; // 这就尝试修改const对象,属于未定义行为!
如果允许T**隐式转const T**,就会出现上面这种绕过const限定的漏洞,所以标准直接禁止了这种隐式转换。如果确实需要做这种转换,你必须使用显式强制类型转换(比如const T** cpp = (const T**)pp;),但此时的类型安全需要你自己负责。
内容的提问来源于stack exchange,提问作者Max Maier
相关产品推荐
相关产品推荐

