簡體   English   中英

該類中已刪除的析構函數顯示為虛擬/直接基類或非靜態數據成員的類型

[英]Deleted destructor in the class appeared as a virtual/direct base class or as a type of non-static data member

關於復制/移動構造函數被隱式刪除的情況,有一條規則:

隱式聲明的copy / move構造函數是其類的內聯公共成員。 如果X具有以下功能,則默認將類X的復制/移動構造函數定義為已刪除(8.4.3):

[...]

—具有從默認構造函數中刪除或無法訪問的析構函數的任何直接或虛擬基類或非靜態數據成員,或

[...]

因為我找不到反映規則的示例,所以我不清楚。 考慮以下代碼:

struct A
{
    ~A() = delete;
};

struct B : A
{
    A a;
    B(){ }; //error error: attempt to use a deleted function B(){ };
    B(const B&&)  = delete;
};

B *b = new B;

int main() { }

DEMO

因為刪除的move構造函數不參與重載解析,所以我預計該錯誤將類似於“ Copy構造函數被隱式刪除”。 但是相反,我得到了有關刪除的B()的錯誤,我明確定義了它。 您能否提供一個反映該規則的示例?

僅根據您提供的摘錄,以下為示例:

struct inner
{
    ~inner() = delete;
};

struct outer
{
    inner inst;

    // Can't destroy "inst"; outer now has an implicitly
    // deleted destructor and copy/move constructor.
};

看第5點:顯然是您已經刪除了基類dtor,所以遇到了這個問題。

鏈接: http//en.cppreference.com/w/cpp/language/default_constructor

刪除隱式聲明的默認構造函數

如果滿足以下任一條件,則類T的隱式聲明或默認的默認構造函數未定義(直到C ++ 11)定義為已刪除(從C ++ 11開始):

  1. T具有引用類型的成員,而沒有大括號或相等的初始化程序。 (自C ++ 11起)

  2. T有一個const成員,沒有用戶定義的默認構造函數或大括號或相等的初始化程序(自C ++ 11起)。

  3. T有一個成員(沒有花括號或等於的初始值設定項)(自C ++ 11起),該成員具有已刪除的默認構造函數,或者其默認構造函數不明確或無法從此構造函數訪問。

  4. T具有直接或虛擬基數,該基數具有已刪除的默認構造函數,或者從該構造函數不明確或不可訪問。

  5. T具有直接或虛擬基礎,該基礎具有已刪除的析構函數,或無法從此構造函數訪問的析構函數。

  6. T是具有至少一個具有非平凡默認構造函數的變體成員的聯合。 (自C ++ 11起)

  7. T是一個聯合,其所有變體成員都是const。

暫無
暫無

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

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