簡體   English   中英

在初始化程序中調用的已刪除構造函數

[英]Deleted constructor called in initializer

是的,我知道析構函數很重要,但在這種情況下 Foo 和 Bar 都將成為單例。 出於調試目的,我想確保單例對象永遠不會被刪除(我不小心做了一次)。

class Bar {
public:
    Bar();
    ~Bar() = delete;
}
class Foo {
public:
    Foo();
    Bar b;
}

所有構造函數和析構函數體都是空的。 所以 cpp 看起來像

Foo::Foo() {
}

此代碼會導致我不希望出現的錯誤。 我會理解它對在 Foo 的析構函數方法中沒有析構函數感到沮喪,但我在構造函數上得到了一個錯誤。 出於某種原因,編譯器說它引用了一個已刪除的函數。 為什么它在構造函數中關心這個?

Bar b; 因為類成員意味着b必須有一個可訪問的析構函數。

這樣做的基本原理是,如果在構造 a Foo期間,在構造b之后但在構造Foo完成之前的某個時刻拋出異常,則可以將其銷毀。

不幸的是,即使您的代碼沒有任何可能的例外,這條規則仍然有效。 你將不得不重新設計你的類布局,這樣單例就不會直接作為其他類的數據成員包含在內,即使它們也是單例。

參考:

C++17 [class.base.init]/12:

在非委托構造函數中,可能會調用每個可能構造的類類型子對象的析構函數。 [注意:該條款確保在拋出異常的情況下可以為完全構造的子對象調用析構函數(18.2)。 ——尾注]

還有 [class.dtor]/12.4:

如果可能調用的析構函數被刪除或無法從調用上下文訪問,則程序格式錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM