簡體   English   中英

將const引用返回給臨時對象的成員

[英]returning const reference to a member of a temporary object

當返回對臨時對象的成員的const引用時會發生什么; 那個對象的生命周期是多少;

例如

struct temp
{
  T m_mine;

  static temp make()
  {
    return temp();
  }
};

T const & foo()
{
  return temp::make().m_mine;
}

c ++ 98和c ++ 11的行為是什么?

在這種情況下,對象或裁判類型的常量無關緊要:它只是返回對當時不再存在的對象的引用。 然后使用引用是未定義的行為。

同樣,如果將對const的成員引用綁定到對象,則不會延長裁判的生命。

對象生存期擴展僅適用於將本地引用綁定到對象的情況,僅適用於引用const對象或rvalue引用的情況。


我寫這篇文章時的示例代碼有幾個問題。 請僅發布實際代碼 (盡可能發布)。 它應該粘貼,而不是重新輸入。

(另外,由於現在至少有2個答案涉及代碼的問題,因此在不改變答案的上下文並因此使其無效的情況下糾正它為時已晚。因此,在原始發布中獲取代碼非常重要值得記住下一個SO問題。)

在進行編譯之前,您的代碼在多個帳戶中是不正確的:

  • 類型聲明后至少缺少一個分號
  • 代碼使用非static成員make() ,就像它是static函數一樣

一旦克服了這一點:返回的引用引用了一個對象的子對象,該對象在執行return語句之后以及任何可以獲取它之前被銷毀。 也就是說,有一個陳舊的參考回報。 對此引用的任何訪問都將導致未定義的行為。 如果運氣好的話,程序會在此時崩潰。 如果你運氣不好,它會做你喜歡的事情。 例如,它可以“工作”,直到程序被證明給客戶或投資者,此時它可能決定反而顯示侮辱。

暫無
暫無

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

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