簡體   English   中英

關於將const引用返回給臨時參數

[英]about returning a const reference to a temporary argument

我正在使用Ubuntu下的g ++ 4.8.4進行編譯。

我無法理解為什么下面的代碼工作正常意味着打印總是在控制台上輸出一些而不會崩潰。

我相信函數foo()被賦予一個臨時對象,該對象將持續到函數foo()完成其執行。

當然輸出參數將指向已分配臨時值的堆棧上的相同地址,但我驚訝地發現每次調用A::hello()可以正常工作。

我認為應該避免對該區域內存的任何訪問。

我想用'valgrind'仔細檢查,它也說一切都好。 我嘗試用-Wstack-protector重新編譯,什么都沒有。

你知道為什么會這樣嗎? 我的信念是錯的,還是僅僅是那些最不可避免的“未定義”C ++行為之一?

 #include <iostream>     
 using namespace std;

 struct A {
    A(): a(10) { cout << "a" << endl;  }
   ~A() {cout << "bye" << endl; }
    void hello() const { cout << "hi " << a << endl; }
 };

 const A& foo(const A& a = A()) {
   return a;
 }

 int main() {
   for( int i = 0; i < 10 ; i++) {
      const A& a = foo();
      a.hello();
   }
   return 0;
 }


 Output
 'a' 
 'bye'
 'hi 10'
 'a' 
 'bye'
 'hi 10'
  ...

行為未定義。

const引用綁定到匿名臨時將該匿名臨時的生存期延長到該const引用的生命周期。

但是,試圖重新綁定返回引用的afoo 不會延長壽命:壽命延長是不可傳遞的 所以amain()懸空引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM