35得票1回答
Hinnant的堆栈分配器相关问题

我一直在使用Howard Hinnant的堆栈分配器,它非常好用,但是其中的一些实现细节对我来说有点不清楚。 为什么要使用全局操作符new和delete?allocate()和deallocate()成员函数分别使用::operator new和::operator delete。类似地,...

21得票5回答
C++1z动态异常规范错误

我正在尝试使用新的GCC版本7.2.1编译我的项目,但在动态异常规范方面遇到了问题:error: ISO C++1z does not allow dynamic exception specifications MEMORY_ALLOC_OPERATORS(SQLException) 问...

17得票2回答
std::runtime_error::runtime_error(const std::string&)如何满足std::exception对throw()的要求?

标准库的异常处理类std::exception要求其构造函数必须是throw()类型的。然而,std::runtime_error接受一个std::string作为其参数,这表明它在某个地方存储了一个std::string。因此,必然存在赋值或复制构造操作。而对于std::string来说,这...

16得票3回答
异常规格说明

我知道这个特性在C++0x中将被废弃,但对于像我这样的完全新手来说,这似乎是一个好主意。有人能解释一下为什么不是一个好主意吗? 我知道这个特性在C++0x中将被废弃,但对我这样的初学者而言,它似乎是一个不错的想法。有人可以解释一下为什么这不是一个好主意吗?

14得票1回答
声明一个已删除的函数为noexcept有意义吗?

考虑以下两种可能的类定义: 样例 A:struct A { A() = delete; }; 附录 A′:struct A { A() noexcept = delete; } 将已删除的函数声明为noexcept有意义吗?

14得票1回答
异常规格说明如何影响虚析构函数的覆盖?

C++标准对于具有异常规格的虚函数陈述如下: 如果一个虚函数有一个异常规格,那么任何派生类中覆盖该虚函数的任何函数(包括定义),都只能允许基类虚函数异常规格允许的异常(C++03 §15.4/3)。 因此,以下是不合法的:struct B { virtual void f(...

12得票3回答
过渡到C++11,其中析构函数隐式声明为noexcept

在C++11中,没有任何异常规范的析构函数会被隐式声明为noexcept,这与C++03不同。因此,在C++03中从析构函数抛出异常的代码在C++11中仍然可以编译,但一旦尝试从这样的析构函数中抛出异常,程序将在运行时崩溃。 由于这种代码没有编译时错误,因此如何安全地将其转换为C++11呢?...

12得票1回答
为什么std::map的find()函数没有声明为noexcept?

C++14 标准将std::map的find()成员函数定义如下:iterator find(const key_type& x); const_iterator find(const key_type& x) const; 这些函数为什么不被定义为noexcept?内部可能出...

10得票11回答
是否有一个通用的成语来表示C++代码可能会抛出异常?

我曾经遇到过使用C++代码时出现不按照调用方预期抛出异常的问题。但并不总是可能或实际可行地读取每一行你正在使用的模块,以查看是否会抛出异常,如果会抛出,则是什么类型的异常。 有没有已经建立的惯用语或“最佳实践”可用于解决这个问题? 我想到了以下方法: 在我们的doxygen文档中,我们...

10得票2回答
为什么C++异常规范在编译时不会被检查?

我刚读到C++11标准修订版中弃用了异常规范。以前我认为指定函数可能抛出的异常是好习惯,但显然情况并非如此。 阅读完Herb Stutter广受引用的文章后,我不禁想问:为什么异常规范被实现成这样?为什么委员会决定将其弃用而不是在编译时检查它们?为什么编译器允许抛出函数定义中没有出现的异常?...