如何理解C++ 臨時(shí)變量的常量性
1.認(rèn)識(shí)臨時(shí)變量的常量性
關(guān)于臨時(shí)變量的常量性,先看一段代碼。
void print(string& str)
{
cout<<str<<endl;
}
//如此調(diào)用會(huì)報(bào)編譯錯(cuò)誤
print("hello world");
在Linux環(huán)境使用g++編譯,會(huì)出現(xiàn): invalid initialization of non-const reference of type ‘std::string&' from a temporary of type 'std::string'的錯(cuò)誤。其中文意思為臨時(shí)變量無(wú)法為非const引用初始化。出錯(cuò)的原因是編譯器根據(jù)字符串"hello world"構(gòu)造一個(gè)string類(lèi)型的臨時(shí)對(duì)象,這個(gè)臨時(shí)變量具有const屬性,當(dāng)這個(gè)臨時(shí)變量傳遞給非const的string&引用類(lèi)型時(shí),無(wú)法隱式完成const到非const的類(lèi)型轉(zhuǎn)換,便出現(xiàn)上面的編譯錯(cuò)誤。解決辦法是將print()函數(shù)的參數(shù)改為常引用。代碼修改如下,可順利通過(guò)編譯。
void print(const string& str)
{
cout<<str<<endl;
}
//順利通過(guò)編譯
print("hello world");
通過(guò)以上代碼,可以看出在設(shè)計(jì)函數(shù)時(shí),形參盡可能地使用const,這樣可以使代碼更為健壯,將錯(cuò)誤暴露于編譯階段。
2.臨時(shí)變量常量性的原因
為什么臨時(shí)對(duì)象作為引用參數(shù)傳遞時(shí),形參必須是常量引用呢?很多人對(duì)此的解釋是臨時(shí)變量是常量,不允許賦值改動(dòng),所以作為非常量引用傳遞時(shí),編譯器就會(huì)報(bào)錯(cuò)。這個(gè)解釋在理解臨時(shí)變量不能作為非const引用參數(shù)這個(gè)問(wèn)題上是可以的,但不夠準(zhǔn)確。事實(shí)上,臨時(shí)變量是可以作為左值(Lvalue) 并被賦值的,請(qǐng)看下面的代碼:
class IntClass
{
private:
int x;
public:
IntClass(int value):x(value){}
friend ostream& operator<<(ostream &os, const IntClass &intc);
};
//重載operator<<
ostream& operator<<(ostream &os, const IntClass &intc)
{
os<<intc.x;
return os;
}
int main(int argc,char* argv[])
{
cout << (IntClass(6) = IntClass(8))<<endl;
}
程序輸出:
8
以上代碼正確編譯運(yùn)行,沒(méi)有錯(cuò)誤。IntClass(6)表示生成一個(gè)無(wú)名臨時(shí)變量并作為左值被修改,所以臨時(shí)變量并不是常量,只是編譯器從語(yǔ)義層面限制了臨時(shí)變量傳遞給非const引用。注意,這里與《C++編程思想》在第八章中的“臨時(shí)量”小節(jié)中認(rèn)為“編譯器使所有的臨時(shí)量自動(dòng)設(shè)為const”的說(shuō)法有些不同。
那編譯器為何作出如此限制呢?如果一個(gè)實(shí)參以非const引用傳入函數(shù),編譯器有理由認(rèn)為該實(shí)參會(huì)在函數(shù)中被修改,并且這個(gè)被修改的引用在函數(shù)返回后要發(fā)揮作用。但如果把一個(gè)臨時(shí)變量當(dāng)作非const引用參數(shù)傳進(jìn)來(lái),由于臨時(shí)變量的特殊性,臨時(shí)變量所在的表達(dá)式執(zhí)行結(jié)束后,臨時(shí)變量就會(huì)被釋放,所以,一般說(shuō)來(lái), 修改一個(gè)臨時(shí)變量是毫無(wú)意義的,據(jù)此,C++編譯器加入了臨時(shí)變量不能作為非const引用實(shí)參這個(gè)語(yǔ)義限制,意在限制這個(gè)非常規(guī)用法的潛在錯(cuò)誤。
以上就是如何理解C++ 臨時(shí)變量的常量性的詳細(xì)內(nèi)容,更多關(guān)于C++ 臨時(shí)變量的常量性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言求兩個(gè)字符串的最長(zhǎng)公共子串
這篇文章主要介紹了C語(yǔ)言求兩個(gè)字符串的最長(zhǎng)公共子串,實(shí)例分析了C語(yǔ)言操作字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
C++實(shí)現(xiàn)反轉(zhuǎn)鏈表的兩種方法
本文主要介紹了C++實(shí)現(xiàn)反轉(zhuǎn)鏈表的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
C++實(shí)現(xiàn)的分布式游戲服務(wù)端引擎KBEngine詳解
這篇文章主要詳細(xì)介紹了C++實(shí)現(xiàn)的分布式游戲服務(wù)端引擎KBEngine的概念以及使用方法,非常的實(shí)用,有需要的小伙伴可以參考下2015-03-03
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易通訊錄實(shí)例
大家好,本篇文章主要講的是C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易通訊錄實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-02-02

