首頁 > 後端開發 > C++ > 你能在 C 語言中將一個物件傳遞給它自己的建構子嗎?

你能在 C 語言中將一個物件傳遞給它自己的建構子嗎?

Patricia Arquette
發布: 2024-11-11 05:06:02
原創
280 人瀏覽過

Can You Pass an Object into Its Own Constructor in C  ?

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板