将const指针返回const int

问题描述 投票:0回答:2

使用此代码:

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结束时会被破坏?

c pointers const
2个回答
1
投票

这里有两种类型的“不匹配”,第一种是>>

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限定词没有任何害处。删除它们存在危险,因此您会在第一种情况下得到警告。


0
投票

但是编译器不会抱怨从const指针降级为一个指针时会丢弃const限定符。

© www.soinside.com 2019 - 2024. All rights reserved.