您好,登錄后才能下訂單哦!
1.認(rèn)識臨時變量的常量性
關(guān)于臨時變量的常量性,先看一段代碼。
void print(string& str) { cout<<str<<endl; } //如此調(diào)用會報編譯錯誤 print("hello world");
在Linux環(huán)境使用g++編譯,會出現(xiàn): invalid initialization of non-const reference of type ‘std::string&' from a temporary of type 'std::string'的錯誤。其中文意思為臨時變量無法為非const引用初始化。出錯的原因是編譯器根據(jù)字符串"hello world"構(gòu)造一個string類型的臨時對象,這個臨時變量具有const屬性,當(dāng)這個臨時變量傳遞給非const的string&引用類型時,無法隱式完成const到非const的類型轉(zhuǎn)換,便出現(xiàn)上面的編譯錯誤。解決辦法是將print()函數(shù)的參數(shù)改為常引用。代碼修改如下,可順利通過編譯。
void print(const string& str) { cout<<str<<endl; } //順利通過編譯 print("hello world");
通過以上代碼,可以看出在設(shè)計函數(shù)時,形參盡可能地使用const,這樣可以使代碼更為健壯,將錯誤暴露于編譯階段。
2.臨時變量常量性的原因
為什么臨時對象作為引用參數(shù)傳遞時,形參必須是常量引用呢?很多人對此的解釋是臨時變量是常量,不允許賦值改動,所以作為非常量引用傳遞時,編譯器就會報錯。這個解釋在理解臨時變量不能作為非const引用參數(shù)這個問題上是可以的,但不夠準(zhǔn)確。事實上,臨時變量是可以作為左值(Lvalue) 并被賦值的,請看下面的代碼:
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
以上代碼正確編譯運行,沒有錯誤。IntClass(6)表示生成一個無名臨時變量并作為左值被修改,所以臨時變量并不是常量,只是編譯器從語義層面限制了臨時變量傳遞給非const引用。注意,這里與《C++編程思想》在第八章中的“臨時量”小節(jié)中認(rèn)為“編譯器使所有的臨時量自動設(shè)為const”的說法有些不同。
那編譯器為何作出如此限制呢?如果一個實參以非const引用傳入函數(shù),編譯器有理由認(rèn)為該實參會在函數(shù)中被修改,并且這個被修改的引用在函數(shù)返回后要發(fā)揮作用。但如果把一個臨時變量當(dāng)作非const引用參數(shù)傳進(jìn)來,由于臨時變量的特殊性,臨時變量所在的表達(dá)式執(zhí)行結(jié)束后,臨時變量就會被釋放,所以,一般說來, 修改一個臨時變量是毫無意義的,據(jù)此,C++編譯器加入了臨時變量不能作為非const引用實參這個語義限制,意在限制這個非常規(guī)用法的潛在錯誤。
以上就是如何理解C++ 臨時變量的常量性的詳細(xì)內(nèi)容,更多關(guān)于C++ 臨時變量的常量性的資料請關(guān)注億速云其它相關(guān)文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。