[英]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.