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
的构造函数
我有两个继承自 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
.
您只需使用 std::runtime_error
中的适当构造函数即可进行此编译,例如
BError(int n) : std::runtime_error(""), num_(n) {};
将调用接受 const char *
.
std::runtime_error
的构造函数