2013-07-25 240 views
0

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

如果你在修改后加上'const',问题应该很明显。如果'T'是'int *',什么是'T const'? –

+1

当然,任何返回值的顶级'const'或'volatile'都会被忽略,除非返回的类型是类类型。 –

回答

1

A(* const的)指针指指针的目标地址无法改变,但在该地址的对象可能被改变。

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

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

2

它的Cuz的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`