使用此代码:
const int* const fun(const int *const ptr)
{
return ptr;
}
int main()
{
int i=9;
int *main_ptr;
main_ptr = fun(&i);
return 0;
}
编译器警告:
警告:赋值会从指针目标类型[-Wdiscarded-qualifiers]中删除“ const”限定词main_ptr = fun(&i);
在将main_ptr
定义为指向const int
的指针时,警告消失了(这是可以理解的,但是编译器不会抱怨从const
指针降级为指针时会丢弃const
限定符。
在一种情况下是警告的行为,而在另一种情况下是没有警告的行为,因为在这种情况下,当指向const int
的指针时,指向的变量在函数fun
结束时不会被破坏,并且由于同样的原因,const
指向int
部分的指针无关紧要,因为该变量是局部变量,并且在fun
结束时会被破坏?
这里有两种类型的“不匹配”,第一种是>>
main_ptr = fun(...) // const int *const -> int *
[通过将其分配给
const
来丢弃fun
的返回值的main_ptr
值,第二个为
... = fun(&i) // int * -> const int *const
我们将普通的旧
int *
传递到采用const int *const
的函数中。
您已经注意到,执行第一个操作时会被警告,因为我们失去了确保返回类型为fun
的安全保证。
第二个不是问题,因为我们在执行fun
时获得了安全性保证,即该参数指向一个常数整数。实际上,该参数并不引用常量int
,但添加更多限制性的const
限定词没有任何害处。删除它们存在危险,因此您会在第一种情况下得到警告。
“ 但是编译器不会抱怨从
const
指针降级为一个指针时会丢弃const
限定符。