为什么 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*
它的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) 指针表示指针的目标地址不能更改,尽管该地址处的对象可能会更改。
您的函数返回一个 (* const) 指针,但是代码可以编译,因为 (* const) 指针被复制到您的 z 变量中,这不会更改 makeConst 返回的实际指针,然后超出范围并被销毁。
如果要防止通过指针修改目标对象,请将 const 放在 * 之前。