簡體   English   中英

std::runtime_error 子項中的默認構造函數

[英]The default constructor in an child of std::runtime_error

我有兩個從 std::runtime_error 繼承的異常類。 第一個, AError ,工作得很好。

class AError : public std::runtime_error {
public:
    const char* what() const noexcept
    {
        return "Error of type A!";
    }
};

第二個BError無法編譯,因為std::runtime_error沒有默認構造函數。

class BError : public std::runtime_error {
public:
    const int num_;

    BError(int n) : num_(n) {}; // ERROR: no default constructor for runtime_error

    const char* what() const noexcept
    {
        return "Error of type B!";
    }
};

在我看來, AError不應該編譯,因為AError的默認構造AError應該在默認構造函數AError調用std::runtime_error的默認構造AError 允許該示例編譯的AError的默認構造函數中發生了什么?

在我看來,AError 不應該編譯,因為 AError 的默認構造函數應該在默認構造函數 AError 中調用 std::runtime_error 的默認構造函數。

AError的默認 ctor 被刪除,因為它繼承自一個沒有默認 ctor 的類。 嘗試以下操作,代碼將無法編譯

AError er;

AError的定義AError編譯,因為它沒有默認構造函數(不接受任何參數的構造函數)。 默認構造函數的隱式生成被抑制,因為std::runtime_error沒有。 類定義本身沒有可診斷的錯誤,因為它不創建類的任何實例。

使用默認構造函數創建AError實例的任何嘗試都會出現可診斷錯誤

AError an_error;    // error since AError cannot be default constructed

BError ,構造函數的定義(在類BError

 BError(int n) : num_(n) {}; // ERROR: no default constructor for runtime_error

嘗試隱式構造基礎std::runtime_error ,即使它未在初始化列表中列出。 所以這個定義在功能上等價於

BError(int n) : std::runtime_error(), num_(n) {};

並且是一個可診斷的錯誤,因為嘗試使用std::runtime_error的(不存在的)默認構造函數 - 編譯器清楚可見。

您可以通過簡單地使用std::runtime_error的適當構造函數來進行編譯,例如

BError(int n) : std::runtime_error(""), num_(n) {};

它將調用接受const char *std::runtime_error的構造const char *

暫無
暫無

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

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