將C 物件傳遞到它們自己的建構子
在C 中,這可能看起來違反直覺,但將C 物件傳遞到其自己的構造函數中確實是合法的自己的構造函數。考慮以下程式碼片段:
#include <iostream> struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; int main(int argc, char** argv) { Foo foo(foo); // Surprising, yet valid std::cout << &foo << std::endl; }
在此範例中,我們將建構的 Foo 物件 (&foo) 的位址傳遞到自己的建構函式中。這可能類似於循環定義,但 C 標準不認為它是未定義的行為。
解釋
該標準允許我們在之前以有限的方式使用未初始化的對像他們的完整初始化。具體來說,允許綁定對其的引用或獲取其地址。這是在缺陷報告 363 和 C 14 標準草案第 3.8 節中定義的。
這意味著在上面的程式碼中,我們沒有違反該語言設定的任何約束。我們只是以符合標準的方式在建構函式中使用未初始化的 foo 物件。
Clang 的警告
但是,值得注意的是,某些編譯器就像 Clang 可能會發出有關未初始化變數的警告。這是因為從未初始化的自動變數產生不確定的值通常被認為是未定義的行為。不過,在這種情況下,我們不會引入不確定性,因為我們只是綁定引用並在建構函數中取得地址。
限制
重要的是要強調儘管標準允許這種行為,但不應將其視為良好實踐或有任何實際用例。本次討論的主要目的是闡明 C 語言語意學中鮮為人知的面向。
以上是你可以將 C 物件傳遞給它自己的建構子嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!