为什么const指针自动转换为非const指针?在这个简单的代码? 不应该在这里警告编译器?或抛出一个错误?指向const对象的指针自动转换为指向对象的指针
template<typename T>
const T makeConst(T a){
return a;
}
int * j = new int(9);
int * z = makeConst(j); // cast from int* const ==> int*
为什么const指针自动转换为非const指针?在这个简单的代码? 不应该在这里警告编译器?或抛出一个错误?指向const对象的指针自动转换为指向对象的指针
template<typename T>
const T makeConst(T a){
return a;
}
int * j = new int(9);
int * z = makeConst(j); // cast from int* const ==> int*
A(* const的)指针指指针的目标地址无法改变,但在该地址的对象可能被改变。
你的函数返回一个(* const)指针,但是代码编译是因为(* const)指针复制到你的z变量中,它不会改变makeConst返回的实际指针,然后超出范围并且被销毁。
如果要防止通过指针修改目标对象,请将const放在*之前。
它的Cuz的int*const
是const int*
不同。 int* const
表示您不能更改指针指向的内容,但可以更改该值。这是编译器从指针解析<typename T>
的方式。为了解决这个问题,我们通常使用的模板是这样的:
template<typename T>
const T* makeConst(T* a){
return a;
}
int * j = new int(9);
int * z = makeConst(j); // error C2440 in Visual Studio`
如果你在修改后加上'const',问题应该很明显。如果'T'是'int *',什么是'T const'? –
当然,任何返回值的顶级'const'或'volatile'都会被忽略,除非返回的类型是类类型。 –