- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
std::exception
要求其构造函数是 throw()
。然而 std::runtime_error
接受一个 std::string
作为它的参数,这表明它在某处存储了一个 std::string
。因此,必须在某处进行分配或复制构造。对于 std::string
,这不是 nothrow
操作。
那么 runtime_error::runtime_error
是如何满足 throw()
的呢?
(对于上下文,我正在实现一个异常类型,并且想从调用站点存储一些 std::string
s,我想正确地做到这一点......)
最佳答案
(Here's 在极简测试用例中同样的事情。)
runtime_error::runtime_error(string const&)
不需要满足 throw()
。
它不会继承或覆盖 exception::exception()
,当 string
的复制构造函数被调用时,exception::exception()
已完成。
如果复制 string
会引发异常,这将展开 runtime_error::runtime_error(string const&)
然后,我想,调用 exception: :~exception()
.
很难直接表明派生 ctor 不需要满足基 ctor 的异常说明符,但以下段落强烈暗示了这一点(描述了如何调用基的析构函数,而不是将异常传递给基础构造函数):
[2003: 15.2/2]
An object that is partially constructed or partially destroyed will have destructors executed for all of its fully constructed subobjects, that is, for subobjects for which the constructor has completed execution and the destructor has not yet begun execution. Should a constructor for an element of an automatic array throw an exception, only the constructed elements of that array will be destroyed. If the object or array was allocated in a new-expression, the matching deallocation function (3.7.3.2, 5.3.4, 12.5), if any, is called to free the storage occupied by the object.
唯一与您假设的(我最初假设的)情景更接近的段落如下。
[2003: 15.4/3]
If a virtual function has an exception-specification, all declarations, including the definition, of any function that overrides that virtual function in any derived class shall only allow exceptions that are allowed by the exception-specification of the base class virtual function.
但显然 exception::exception()
不是虚函数,而且显然 runtime_error::runtime_error(string const&)
不会覆盖它。
(请注意,这种情况将适用于虚拟析构函数;因此,you can see that, in libstdc++, runtime_error::~runtime_error()
is throw()
)。
关于c++ - std::runtime_error::runtime_error(const std::string&) 如何满足 std::exception 对 throw() 的要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6864011/
我目前正在项目中实现一些自定义异常,无法决定是对我的异常进行类型定义还是为每个异常派生一个新类。对每一种的潜在利弊以及是否更可取感兴趣? 最佳答案 派生您自己的类的优点很简单:您可以在 catch 处
std::exception 要求其构造函数是 throw()。然而 std::runtime_error 接受一个 std::string 作为它的参数,这表明它在某处存储了一个 std::stri
我正在尝试使用继承来创建一个从 runtime_error 派生的类,但我一直收到错误,即使这是练习中使用的确切代码并且作为书中的示例。这是代码: class DivideZeroEx : publi
我正在家里学习 C++,我正在使用 rapidxml 库。我正在使用它提供的实用程序来打开文件: rapidxml::file myfile (&filechars[0]); 我注意到如果 filec
根据 cplusplus.com,这是 std::runtime_error 类的实现: class runtime_error : public exception { public: expl
我正在编写自己的异常类: class Exception : public std::runtime_error{ } 我想重载what()。我该怎么做? 另外,从std::runtime_error
也许我今天没有喝足够的咖啡。下面的程序应该捕获 std::runtime_error 并打印“我捕获了 runtime_error”,对吗? 事实并非如此。该程序没有捕获 std::runtime_e
我不是在寻找解决这个问题的方法,只是想了解它的原因。一位同事向我展示了一些代码,这些代码在由 Visual Studio 2008 编译以在 Windows Mobile 6 ARMV4I 下运行时会
所有 GCC 4.8.4、4.9.3、5.3.0 都通过了 std::exception 的测试(对于任何 -std=c++11/1y/14/1z/17 个选项,如果可用): static_asser
我想知道这一行是否创建了一个悬挂指针: string arg="derp"; throw std::runtime_error("Unknown argument "+arg); std::runti
在我的代码中,我抛出了我的自定义 file_error 异常,它派生自 std::runtime_error。在另一个模块中,我捕获了该操作的异常,并希望像这样处理我的 file_error: try
为什么std::runtime_error不提供接受 std::string&& 的构造函数?看着 the constructors for std::string ,它有一个 move 构造函数,但
我尝试使用Qt(4.6.3)+ MinGW编译以下代码: #include #include int main(int argc, char *argv[]) { throw std::r
Qt 是否有等同于 std::runtime_error 的类(如 QString 等同于 std::string)? 具体来说,std::runtime_error 包含一个描述错误的字符串,因此您
我是 C++ 初学者,我对 C++0x 随机数生成器有疑问。我想使用 Mersenne twister 引擎来生成随机 int64_t 数字,并且我使用我之前找到的一些信息编写了一个函数: #incl
我正在尝试在 Ubuntu 下用 g++ 编译它: #ifndef PARSEEXCEPTION_H #define PARSEEXCEPTION_H #include #include #inclu
例如: #include class A { }; class err : public A, public std::runtime_error("") { }; int main() {
我已经建立了一个库,提供从标准异常派生的异常类: #include #include class BaseException : public std::runtime_error { p
我在启动iOS版NewRelicAgent时遇到问题。我可以保证到昨天为止该服务仍然有效。今天,当应用启动并调用时: [NewRelicAgent startWithApplicationToken:
我正在从 Visual Studio 2013 更新到 Visual Studio 2015 并注意到这种行为差异。 #include #include #include int main()
我是一名优秀的程序员,十分优秀!