问题是关于 C++ 的历史:ISO 标准、修订标准(带有 DR),甚至是标准草案;都算作“C++”。
是否有任何 C++ 不具备此属性:
使用空抛出规范声明的函数throw()
不能抛出异常。
如果该属性不成立,我想要一个反例。
注释:
不言而喻,在函数内抛出异常,然后捕获(不重新抛出)异常,是否会将其转换为“抛出异常的函数”。根据其规范,抛出异常的函数会向其调用者抛出异常。(如果您在内部进行操作,则根据定义,它不是规范的一部分。)
[假设这longjmp
是被禁止的,因为我们有可破坏的物体。]
该问题的其他等效表达是:
是否有任何情况下声明的无抛出函数的调用者不得不担心这种可能性(等效属性):
- 该函数将控制权交还给其调用者,但不使用 return 语句
- 查看(并能够捕获)该函数抛出的异常
- 由于调用该函数而导致堆栈展开
- 如果所有其他操作(调用该函数除外)都是非抛出的,则调用者不是非抛出的
换句话说,是否有任何 C++编译器无法根据看到被调用函数的无抛出声明来优化调用函数?