在一個函數(shù)中有個參數(shù)是 CONST 類型,例如: string & max(string s1,string s2) ,那么我調(diào)用的時候有可能會這樣寫:max("abc","edf"); 然后編譯,出錯。提示為 無法將 CONST 類型轉(zhuǎn)換為 非CONST 類型。那是因為編譯器在接收到"abc"的時候會生成一個臨時變量,然后將這個臨時變量傳入到 max 函數(shù)中。但是這個臨時變量是 CONST 類型的,與該函數(shù)的定義不一致,所以會在編譯時拋出類型不一致的錯誤。
因為這樣做可以防止傳遞到函數(shù)內(nèi)的臨時值被修改。否則,程序員就會很奇怪地發(fā)現(xiàn),只有編譯器產(chǎn)生的臨時值可以修改而他們在函數(shù)調(diào)用時實際傳進去的參數(shù)卻不行。(關于這一點是有事實根據(jù)的,早期版本的c++允許這類的臨時值可以被產(chǎn)生,傳遞,修改,結果很多程序員感到很奇怪)
const string& max(const string& s1,const string& s2)
{
return s1;
};
然后調(diào)用
const string &s = max("abc", "edf");
在 VS2005 下編譯不通過,錯誤提示為 :
error C2440: “return”: 無法從“const char *”轉(zhuǎn)換為“const char (&)[4]”
但是在 LINUX 下用 KDEVELOP 編譯卻沒有問題。我想可能是編譯器在自動創(chuàng)建臨時變量的時候的類型轉(zhuǎn)換是不一樣,當該函數(shù)在接受字符串參數(shù)的時候 KDEVELOP 能夠?qū)⒆址D(zhuǎn)換成 CONST 的STRING 引用類型,但是 VS 卻將其轉(zhuǎn)換成了 const char * 。不知這樣推斷是否正確,可能還要再查下 MSDN 可能能夠得出其中的一部分的答案,呵呵。


