首頁  >  文章  >  後端開發  >  ## 在 C 中將常數引用綁定到臨時物件的子物件是否會延長其生命週期?

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

DDD
DDD原創
2024-10-26 04:20:02410瀏覽

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

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

在這樣的C 程式碼中:

<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>

在這樣的C 程式碼中:

在這樣的C 程式碼中:

不同的編譯器對於臨時物件center() 的生命週期有不同的行為。 GCC 在進入 main 中的 printf 之前銷毀臨時文件,而 Clang 延長其生命週期以匹配引用 x 的生命週期。但是,如果將 x 和 y 成員替換為自訂類別 Double,則兩個編譯器都會同意並延長臨時的生命週期。

標準注意事項

此行為可透過以下方式解決CWG 1651 規定,應用於純右值的成員存取或下標表達式的結果是xvalue,並且將引用綁定到此類臨時子物件不應延長其生命週期。雖然兩個編譯器都將 center().x 視為純右值,但它們並未完全實作 CWG 1651 提出的變更。

  • 編譯器差異

GCC

  • 不會延長標量子物件的生命週期,因為它們在[dcl.init.ref]/(5.2.1.1) 下不被視為臨時物件。

Clang

識別成員存取並已實施生命週期延長規則,甚至處理強制轉換。 未來標準變更 N3918 是DR 1651 的一項待決決議,它將澄清透過成員表達式存取臨時變數應該延長其生命週期。一旦採用,此變更將使 Clang 的行為與標準保持一致。

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn