假设Foo
构造函数没有在Windows上调用影响errno
的任何函数或类似GetLastError()
的类似状态代码,是否可以保证
throw Foo
不会影响任何这些值。也就是说,我可以将错误代码的读取推迟到Foo的构造函数吗?如果没有标准规定,我最感兴趣的是GCC,GNU / Linux和MinGW-SJLJ变种的行为。
答案 0 :(得分:1)
函数GetLastError()
是Windows特定的,非标准的。异常不会影响返回的值:只有对OS函数的调用才会更新它(除非您调用SetLastError()
)。
尽管如此,抛出异常会对范围内的自动对象产生潜在影响:
15.2 / 1 当控件从抛出异常的位置传递到处理程序时,将为所有自动对象调用析构函数 从输入try块开始构造。自动对象是 以完成他们的相反顺序销毁 构造
如果任何此类对象的析构函数包含对OS的调用,则可能会对GetLastError()
产生影响。
总结一下: 首先调用Foo
构造函数,然后调用已完全构造的本地对象的析构函数,最后抛出“转移控件”到最近的异常处理程序。因此,预计不会调用库函数。该标准对任何基本流控制语句使用相同的措辞(“传输控制”或“传递控制”),例如break,continue和goto。