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中调用std::runtime_error的默认构造函数。 AError 允许该示例编译的默认构造函数中发生了什么?

It seems to me that AError should not compile because the default constructor of AError should call the default constructor of std::runtime_error in the default constructor AError.

AError 的默认构造函数已删除,因为它继承自没有默认构造函数的 class。尝试以下操作,代码无法编译

AError er;

AError 的定义可以编译,因为它没有默认构造函数(不接受任何参数的构造函数)。默认构造函数的隐式生成被禁止,因为 std::runtime_error 没有。 class 定义本身没有可诊断的错误,因为它不会创建 class.

的任何实例

使用默认构造函数

创建AError实例的任何尝试都存在可诊断错误
AError an_error;    // error since AError cannot be default constructed

BError中,构造函数的定义(在classBError内)

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

尝试隐式构造基 std::runtime_error,即使它未在初始化列表中列出。所以这个定义在功能上等同于

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

and 是一个可诊断的错误,由于尝试 - 编译器清楚可见 - 使用 std::runtime_error.

的 (non-existent) 默认构造函数

您只需使用 std::runtime_error 中的适当构造函数即可进行此编译,例如

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

将调用接受 const char *.

std::runtime_error 的构造函数