2013-07-25 294 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`