簡體   English   中英

為什么您要= delete隱式刪除的默認構造函數,這又意味着什么?

[英]Why would you =delete implicitly deleted default constructors and what is the point?

我試圖刪除所有隱式提供的復制/移動ctor /賦值運算符,但是為什么我仍然能夠顯式刪除應該隱式刪除的默認ctor?

我嘗試過= default-隱式提供的所有復制/移動ctor /賦值運算符,僅告訴它們實際上是= delete而不是= default。 如果我對隱式/顯式的理解正確,那么如果用戶提供了顯式副本ctor,則應隱式刪除默認ctor。

我有以下課程:

class A {
public:
   A() =delete;       
   A(const A&):...{;} --> my explicitly defined copy ctor
   ...
}

我希望編譯器告訴我我不能=delete一個隱式刪除的默認ctor,但事實並非如此。 我正在使用clang8進行編譯。

您只需刪除所需的所有內容,即可完全獨立(如果已(隱式)刪除)。

一個好主意是表明您不想擁有默認的生成函數(例如運算符或構造函數)並將其“標記”為已刪除。 這有助於澄清界面!

但是:即使刪除構造函數,您仍然可以實例化您的類!

class A { 
    public:
        A() =delete;
        A(int) = delete;

        int a;

        void Print() const { std::cout << a << std::endl; }
};  

int main()
{   
    A a{42};
    a.Print();
}  

請參閱: https//en.cppreference.com/w/cpp/language/aggregate_initialization

來自您的評論:

我不希望下一個程序員必須查找繼承鏈來嘗試找出尚未隱式刪除的內容。

只要定義一個構造函數,並且不顯式啟用基本構造函數,就可以:

 using X::X;

根本沒有人需要尋找基類構造函數。 如前所述:最好將“不需要的”方法標記為delete但是在某些情況下,如上所示,在任何情況下都無濟於事!

暫無
暫無

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

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