[英]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.