簡體   English   中英

返回對臨時的 const 引用

[英]Returning const reference to temporary

為什么函數foo會給出警告“返回對臨時的引用”

const bool& foo()
{
    return true;
}

如果像這樣聲明 bar 沒問題並且不會產生任何警告

const bool& bar = true;

PS:我正在使用 GCC

第二個很好,因為從true構造的臨時bool的生命周期將延長到參考bar的生命周期。

每當引用綁定到臨時對象或其子對象時,臨時對象的生命周期就會延長以匹配引用的生命周期

但是生命周期規則不適用於第一種情況。

此生命周期規則有以下例外:

  • 在 return 語句中臨時綁定到函數的返回值不會被擴展:它在 return 表達式的末尾立即被銷毀。 這樣的 return 語句總是返回一個懸空引用。

所以foo總是返回一個懸空引用。

宋元瑤用標准的內容回答了這個問題。 但這並不能真正解釋為什么他們決定 c++ 應該這樣做。

如果你考慮一下編譯器是怎么做的,那么考慮代碼可能會更容易:

 const bool& bar = true;

臨時的生命周期延長到 bar 的生命周期,所以這段代碼相當於:

const bool temp = true;
const bool& bar = temp;

但是讓我們將相同的應用於函數返回:

const bool& foo()
{
    return true;
}

變成

const bool& foo()
{
    const boot temp = true
    return temp;
}

這是否更清楚地表明您現在正在返回對被破壞對象的引用? temp的生命周期不能延長到函數的末尾,因為 1) 存儲位置在foo的堆棧幀中並且消失了,2) 調用者可能不知道函數返回具有延長生命周期的東西必須稍后銷毀,它可能只看到函數聲明const bool& foo()

因此,如果編譯器可以將生命周期延長到函數結束之后,那么它就會泄漏內存。

暫無
暫無

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

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