在下面的代码中,为什么允许返回指针p?如果f代替返回“const int *”,那么编译器将在“int * p = f()”行处抱怨类型不匹配错误。为什么它对“int * const”做同样的事情?
btw:我知道代码中有内存泄漏,但这与问题无关。
int * const f() {
return new int(23);
}
int main(){
int * p=f();
p= new int(35);
return 0;
}
答案 0 :(得分:3)
因为你要返回的是一个不可修改的指针 - 不是指向不可修改数据的指针。
是的,返回的指针不可修改 - 但它永远不会被修改!您正在修改不同的指针p
- 它恰好与您的不可修改(和未命名)指针具有相同的值,该指针现在已经消失 - 该对象是一个临时的,并且在语句完成后就会被遗忘。 / p>
这就是为什么通过函数中的值返回const限定的简单类型没有任何意义,并且实际上在某些编译器中触发了警告。
答案 1 :(得分:0)
在下面的代码中,为什么允许返回的指针p改变?
因为p
的类型是int *
。由于指针不是const,因此可以对其进行修改。如果您希望p
不可修改,那么您必须将其设为const:int * const p
如果f代替返回“const int *”,那么编译器会在“int * p = f()”
行注意类型不匹配错误
Pointer-to-const不能转换为指向非const的指针。语言不允许这种转换,因为它会破坏const的正确性。
为什么它对“int * const”做同样的事情?
我想您的意思是问“为什么编译器允许将int * const
分配给int *
变量?”
将const对象复制到非const对象不会破坏const正确性。当p
是非const时,可以修改它,f
返回的const临时值在整个(短)生命周期内保持不变。
临时的常量很少有意义,因此返回顶级const值。
答案 2 :(得分:0)
*const
是常量指针,而const *
是指向常量的指针。后者是不可改变的价值;您当然可以将此值分配给变量,就像您编写int x = 42;
一样。前者指向一个不可变对象,所以将它赋给一个应该指向一个可变对象的变量可能会违反该对象的常量。