【发布时间】:2011-06-30 15:37:28
【问题描述】:
指向非常量数据的指针可以隐式转换为指向相同类型的 const 数据的指针:
int *x = NULL;
int const *y = x;
添加额外的 const 限定符以匹配额外的间接性在逻辑上应该以相同的方式工作:
int * *x = NULL;
int *const *y = x; /* okay */
int const *const *z = y; /* warning */
但是,使用带有 -Wall 标志的 GCC 或 Clang 编译它会导致以下警告:
test.c:4:23: warning: initializing 'int const *const *' with an expression of type
'int *const *' discards qualifiers in nested pointer types
int const *const *z = y; /* warning */
^ ~
为什么添加一个额外的const 限定符“丢弃嵌套指针类型中的限定符”?
【问题讨论】:
-
小术语:演员表是一种显式转换。您在这里所做的是隐式转换,而不是强制转换。
-
ITYM 指向 const 的指针 指向 const 的指针(“const 指针”可能不明确)。如果
x -> y -> z(其中->仅表示“指向”而不是取消引用运算符)您可以更改内容z而无需更改y。因此,如果它是指向 const 的指针指向非 const 的指针,则可以更改值z而无需更改y。 -
这不只是const correctnessc++ 常见问题解答中解释的一个实例吗?
-
@Jeff 常见问题解答指出可以将
Foo **转换为Foo const * const *。我不太明白它在这里不适用。但听起来这是相关的。如果您愿意将其发布为答案,您将获得我的投票。 -
@Jeff M:C 和 C++ 关于 const-correctness 的规则是不同的,这个问题是关于 C 的。
标签: c constants implicit-conversion qualifiers multiple-indirection