中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解C++ 臨時變量的常量性

發布時間:2020-10-22 06:39:02 來源:腳本之家 閱讀:165 作者:Dabelv 欄目:開發技術

1.認識臨時變量的常量性

關于臨時變量的常量性,先看一段代碼。

void print(string& str)
{
	cout<<str<<endl;
}
//如此調用會報編譯錯誤
print("hello world");

在Linux環境使用g++編譯,會出現: invalid initialization of non-const reference of type ‘std::string&' from a temporary of type 'std::string'的錯誤。其中文意思為臨時變量無法為非const引用初始化。出錯的原因是編譯器根據字符串"hello world"構造一個string類型的臨時對象,這個臨時變量具有const屬性,當這個臨時變量傳遞給非const的string&引用類型時,無法隱式完成const到非const的類型轉換,便出現上面的編譯錯誤。解決辦法是將print()函數的參數改為常引用。代碼修改如下,可順利通過編譯。

void print(const string& str)
{
	cout<<str<<endl;
}
//順利通過編譯
print("hello world");

通過以上代碼,可以看出在設計函數時,形參盡可能地使用const,這樣可以使代碼更為健壯,將錯誤暴露于編譯階段。

2.臨時變量常量性的原因

為什么臨時對象作為引用參數傳遞時,形參必須是常量引用呢?很多人對此的解釋是臨時變量是常量,不允許賦值改動,所以作為非常量引用傳遞時,編譯器就會報錯。這個解釋在理解臨時變量不能作為非const引用參數這個問題上是可以的,但不夠準確。事實上,臨時變量是可以作為左值(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++編程思想》在第八章中的“臨時量”小節中認為“編譯器使所有的臨時量自動設為const”的說法有些不同。

那編譯器為何作出如此限制呢?如果一個實參以非const引用傳入函數,編譯器有理由認為該實參會在函數中被修改,并且這個被修改的引用在函數返回后要發揮作用。但如果把一個臨時變量當作非const引用參數傳進來,由于臨時變量的特殊性,臨時變量所在的表達式執行結束后,臨時變量就會被釋放,所以,一般說來, 修改一個臨時變量是毫無意義的,據此,C++編譯器加入了臨時變量不能作為非const引用實參這個語義限制,意在限制這個非常規用法的潛在錯誤。

以上就是如何理解C++ 臨時變量的常量性的詳細內容,更多關于C++ 臨時變量的常量性的資料請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南平市| 瑞金市| 长沙县| 上高县| 新昌县| 营口市| 从化市| 黑龙江省| 沾益县| 修武县| 博乐市| 即墨市| 永济市| 唐河县| 噶尔县| 彩票| 宁城县| 泗阳县| 樟树市| 溆浦县| 会同县| 鲁甸县| 南丹县| 泸定县| 汝阳县| 无为县| 平泉县| 甘肃省| 手游| 普定县| 沂源县| 高邑县| 葵青区| 增城市| 昌图县| 长顺县| 涡阳县| 黔东| 高安市| 新竹市| 肥东县|