指向常量对象的指针自动转换为指向对象的指针

pointer to const object automatic cast to pointer to object

本文关键字:指针 对象 转换 常量      更新时间:2023-10-16

为什么常量指针会自动转换为非常量指针?在这个简单的代码中?难道不应该在这里警告编译器吗?或者抛出错误?

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*constconst 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返回的实际指针,然后makeConst超出范围并被销毁。

如果要防止通过指针修改目标对象,请将const放在*之前。