在C 中將物件傳遞到它自己的建構子
某些C 程式設計師發現了一個有趣的行為:將物件傳遞到它自己的建構函數。這引發了關於這種做法在 C 中是否合法或被視為未定義行為的問題。
考慮以下程式碼片段:
#include <iostream> struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; int main() { Foo foo(foo); // Surprisingly, this compiles and executes std::cout << &foo << std::endl; }
在此程式碼中,Foo 建構函式接收對在物件完全初始化之前建構物件本身。儘管物件未初始化,但該程式碼是 C 標準允許的。
C 14 標準草稿第 3.8 節闡明,在物件的生命週期開始之前(或結束之後),允許取得其位址或綁定一個引用,只要該引用可以直接綁定即可。只有在對此類部分初始化的物件執行某些操作(例如左值到右值轉換、存取非靜態資料成員或虛擬基類綁定)時,才會出現未定義的行為。
提供的程式碼範例不會違反任何這些限制。我們只是綁定一個引用並在構造函數中獲取地址,這是允許的。
然而,活躍的問題 453 引起了對將引用綁定到未初始化物件的有效性的擔憂。最初提出的語言支援缺陷報告 363,它允許進行此類綁定,如程式碼片段所示。
雖然這種行為最初可能看起來很奇怪,但它是編譯器在初始化之前為物件分配空間的結果。這允許有限的操作,例如引用綁定和地址檢索,而不會產生不確定的值。
以上是你能在 C 語言中將一個物件傳遞給它自己的建構子嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!