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