函式返回區域性變數string的時候能不能被引用?
前兩天被同事突然問道這個問題,見到string一時糊塗了,最初學習c++的時候,就說不能引用區域性變數,現在怎麼糊塗了呢?呵呵
今天想了下,原來是被函式外表蒙蔽了,看個例子
std::string teststringreference()
int main()
這裡的std::string&strrefer = teststringreference();是正確的嗎?
咋一看,這裡不是引用了函式返回的區域性物件嗎? 適用課本的結論:不正確的!
經過測試,上面的用法沒有任何問題,程式不會core,編譯器也沒有任何告警或錯誤,編譯器絕對是沒有問題的,肯定是自己的問題。
除錯了下,發現teststringreference函式在return前,都會呼叫string的建構函式,這裡沒有需要再構造的物件呀?!
想了一下,恍然大悟:是否引用區域性物件(本例僅對基本型別和string,不包括指標類的),取決於函式的返回值,而不是賦值語句。
即這種函式定義才是返回區域性物件的引用
std::string& teststringreference()
第一種定義的方法,實際上返回的不是區域性變數,而是編譯器新構造的臨時物件,現在編譯器都支援rvo(return value optimization),會把這些臨時物件,賦給需要新構造的物件上,無需再次構造。
這裡的問題實際上是個概念混淆了,導致了不確定。把string換成int等基本型別也是一樣的。
所以,請明確什麼是返回區域性變數引用!
C 函式返回區域性變數
原因 返回值是拷貝值,區域性變數的作用域為函式內部,函式執行結束,棧上的區域性變數會銷毀,記憶體釋放。可返回的區域性變數 1.返回區域性變數本身 int sum int a,int b 2.常量 char returnvalue warning deprecatedconversion from s...
C 函式返回區域性變數
目錄2 可返回的區域性變數 示例 int get 或 char getmemory void 示例 int sum int a,int b 常量 char getmemory void 示例 const char getmemory void 或者int returnvalue return val...
c 返回函式區域性物件的引用
在上面的 中,最後能夠輸出正確的值,然而在函式getnode 中,str是乙個區域性的物件,記憶體空間在棧上,當函式退出時,str的記憶體空間被 這是在高階語言的層面上講的。但是為什麼最後的結果是正確的?原因就是node newnode getnode 這句呼叫的是預設的拷貝建構函式,如果是自己重新...