爲什麼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*
爲什麼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*
A(* const的)指針指指針的目標地址無法改變,但在該地址的對象可能被改變。
你的函數返回一個(* const)指針,但是代碼編譯是因爲(* const)指針複製到你的z變量中,它不會改變makeConst返回的實際指針,然後超出範圍並且被銷燬。
如果要防止通過指針修改目標對象,請將const放在*之前。
它的Cuz的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',問題應該很明顯。如果'T'是'int *',什麼是'T const'? –
當然,任何返回值的頂級'const'或'volatile'都會被忽略,除非返回的類型是類類型。 –