C++ Return";int*const";从函数

C++ Return";int*const";从函数,c++,constants,C++,Constants,在下面的代码中,为什么允许更改返回的指针p?如果f返回“const int*”,则编译器将在“int*p=f()”行抱怨类型不匹配错误。为什么“int*const”也是这样 顺便说一句:我知道代码中有内存泄漏,但这与问题无关 int * const f() { return new int(23); } int main(){ int * p=f(); p= new int(35); return 0; } 因为您返回的是不可修改的指针-不是指向不可修改数据的指针 是的,返回的

在下面的代码中,为什么允许更改返回的指针p?如果f返回“const int*”,则编译器将在“int*p=f()”行抱怨类型不匹配错误。为什么“int*const”也是这样

顺便说一句:我知道代码中有内存泄漏,但这与问题无关

int * const f() {
  return new int(23);
}
int main(){
  int * p=f();
  p= new int(35);
  return 0;
}

因为您返回的是不可修改的指针-不是指向不可修改数据的指针

是的,返回的指针不是可修改的-但它永远不会被修改!您正在修改不同的指针,
p
——该指针恰好与不可修改(且未命名)的指针具有相同的值,该指针现在已不存在——该对象是一个临时对象,在语句完成后立即被遗忘

这就是为什么从函数中按值返回const限定的简单类型没有意义,实际上会在某些编译器中触发警告

在下面的代码中,为什么允许更改返回的指针p

因为
p
的类型是
int*
。由于指针不是常量,因此可以对其进行修改。如果希望
p
不可修改,则必须将其设置为常量:
int*const p

如果f返回“const int*”,则编译器将在“int*p=f()行”处抱怨类型不匹配错误

指向常量的指针不能转换为指向非常量的指针。语言不允许这种转换,因为它会破坏常量的正确性

为什么“int*const”也是这样

我猜您的意思是问“为什么编译器允许将
int*const
赋值给
int*
变量?”

将常量对象复制到非常量对象不会破坏常量的正确性。当
p
为非常量时,可以修改它,并且
f
返回的常量临时在其整个(短)生命周期内保持不变


临时变量的常量很少有意义,返回顶级常量值也是如此。

*const
是常量指针,而
const*
是常量指针。后者是不变的价值;当然,你可以把这个值赋给一个变量,就像你写
intx=42。前者指向一个不可变对象,因此将其分配给一个应该指向可变对象的变量可能会违反该对象的常量。

这是真的。您应该使用
int-const*
而不是
int*const
。此外,
int-const*const
将声明一个指针,该指针指向的位置为常量,该位置的实际值也非常相关: