首頁 > 後端開發 > C++ > 主體

## 將常數引用綁定到臨時物件的子物件是否會延長其生命週期?

DDD
發布: 2024-10-26 07:22:30
原創
422 人瀏覽過

## Does Binding a Const Reference to a Sub-Object of a Temporary Extend Its Lifetime?

將常數引用綁定到臨時物件的子物件

考慮以下程式碼:

<code class="cpp">#include <stdio.h>

struct P2d {
    double x, y;
    P2d(double x, double y) : x(x), y(y) {}
    ~P2d() { printf("Destructor called\n"); }
};

P2d center() {
    return P2d(10, 10);
}

int main(int argc, const char *argv[]) {
    const double& x = center().x;
    printf("x = %.18g\n", x);
    return 0;
}</code>
登入後複製

在此範例中,center()傳回一個臨時P2d 物件。問題出現了:這個臨時物件的生命週期是多少?

編譯器行為的差異

不同的編譯器表現出不同的行為:

  • g (版本5.2.0)在進入main中的printf之前銷毀臨時P2d物件。但是,它保留其 x 成員的值。值得注意的是,只有當子物件是類別或陣列類型時,它才會延長臨時物件的生命週期。
  • clang 將臨時 P2d 物件的生命週期延長到 x 引用的生命週期。因此,析構函數在 main 中 printf 之後呼叫。

根據 C 標準,綁定對臨時物件的子物件的引用不會延長臨時物件的生命週期。然而,CWG 1651 涵蓋了這一點,它建議進行更改以延長此類情況下的生命週期。

待解決

現況是只有純右值被視為引用臨時值。但是,成員存取表達式(如 center().x)被 g 和 clang 視為純右值。

  • g 在使用標量子物件時不會延長生命週期,因為 [dcl .init.ref]/(5.2.1.1) 沒有涵蓋它們。
  • clang 已經實現了「新」生命週期擴展規則,一旦CWG 1651 得到解決,這將成為正確的行為.

即將到來的決議將闡明成員存取表達式會產生臨時表達式,並且綁定對這些表達式的引用可以延長相應臨時物件的生命週期。

以上是## 將常數引用綁定到臨時物件的子物件是否會延長其生命週期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!