假设Foo
构造函数不调用任何影响errno
或类似GetLastError()
Windows 上的状态代码的函数,是否可以保证
throw Foo
不影响任何这些值。也就是说,我可以将错误代码的读取推迟到 Foo 的构造函数吗?如果标准没有指定,我最感兴趣的是 GCC、GNU/Linux 和 MinGW-SJLJ 变体的行为。
假设Foo
构造函数不调用任何影响errno
或类似GetLastError()
Windows 上的状态代码的函数,是否可以保证
throw Foo
不影响任何这些值。也就是说,我可以将错误代码的读取推迟到 Foo 的构造函数吗?如果标准没有指定,我最感兴趣的是 GCC、GNU/Linux 和 MinGW-SJLJ 变体的行为。
该功能GetLastError()
是 Windows 特定且非标准的。异常不会影响返回的值:仅调用 OS 函数会更新它(除非您调用 SetLastError()
)。
然而,抛出异常会对范围内的自动对象产生潜在影响:
15.2/1当控制从抛出异常的点传递到处理程序时,将为自进入 try 块以来构造的所有自动对象调用析构函数。自动对象按照其构建完成的相反顺序被销毁。
如果任何此类对象的析构函数包含对操作系统的调用,这可能会对GetLastError()
.
总结一下:首先Foo
调用构造函数,然后调用已经完全构造的本地对象的析构函数,最后 throw 将控制“转移”到最近的异常处理程序。因此,预计不会调用任何库函数。该标准对任何基本流控制语句使用相同的措辞(“转移控制”或“通过控制”),例如 break、continue 和 goto。