關於將常數引用綁定到臨時物件的子物件
在這樣的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
Clang
識別成員存取並已實施生命週期延長規則,甚至處理強制轉換。 未來標準變更 N3918 是DR 1651 的一項待決決議,它將澄清透過成員表達式存取臨時變數應該延長其生命週期。一旦採用,此變更將使 Clang 的行為與標準保持一致。以上是## 在 C 中將常數引用綁定到臨時物件的子物件是否會延長其生命週期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!