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