2

假设Foo构造函数不调用任何影响errno或类似GetLastError()Windows 上的状态代码的函数,是否可以保证

throw Foo

不影响任何这些值。也就是说,我可以将错误代码的读取推迟到 Foo 的构造函数吗?如果标准没有指定,我最感兴趣的是 GCC、GNU/Linux 和 MinGW-SJLJ 变体的行为。

4

1 回答 1

1

该功能GetLastError()是 Windows 特定且非标准的。异常不会影响返回的值:仅调用 OS 函数会更新它(除非您调用 SetLastError())。

然而,抛出异常会对范围内的自动对象产生潜在影响:

15.2/1当控制从抛出异常的点传递到处理程序时,将为自进入 try 块以来构造的所有自动对象调用析构函数。自动对象按照其构建完成的相反顺序被销毁。

如果任何此类对象的析构函数包含对操作系统的调用,这可能会对GetLastError().

总结一下:首先Foo调用构造函数,然后调用已经完全构造的本地对象的析构函数,最后 throw 将控制“转移”到最近的异常处理程序。因此,预计不会调用任何库函数。该标准对任何基本流控制语句使用相同的措辞(“转移控制”或“通过控制”),例如 break、continue 和 goto。

于 2015-06-06T14:42:42.600 回答