0

为什么 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*
4

2 回答 2

2

它的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`
于 2013-07-25T15:42:34.570 回答
1

(* const) 指针表示指针的目标地址不能更改,尽管该地址处的对象可能会更改。

您的函数返回一个 (* const) 指针,但是代码可以编译,因为 (* const) 指针被复制到您的 z 变量中,这不会更改 makeConst 返回的实际指针,然后超出范围并被销毁。

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

于 2013-07-25T15:51:38.360 回答