The C and POSIX standards guarantee that errno
is never set to zero by any library function.
The C++ standard has less to say about when errno
is or isn't set, but libstdc++ follows the same rule and never sets
it to zero.
On the other hand, there are few guarantees about when the C++ library
sets errno
on error, beyond what is specified for
functions that come from the C library.
For example, when std::stoi
throws an exception of
type std::out_of_range
, errno
may or may not have been set to ERANGE
.
Parts of the C++ library may be implemented in terms of C library
functions, which may result in errno
being set
with no explicit call to a C function. For example, on a target where
operator new
uses malloc
a failed memory allocation with operator new
might
set errno
to ENOMEM
.
Which C++ library functions can set errno
in this way
is unspecified because it may vary between platforms and between releases.