A C++ standard library function shall not directly or indirectly access
objects ([intro.multithread]) accessible by threads other than the current thread
unless the objects are accessed directly or indirectly via the function's arguments,
including this.
A C++ standard library function shall not directly or indirectly modify
objects ([intro.multithread]) accessible by threads other than the current thread
unless the objects are accessed directly or indirectly via the function's non-const
arguments, including this.
This means, for example, that implementations can't use a static object for
internal purposes without synchronization because it could cause a data race even in
programs that do not explicitly share objects between threads.
A C++ standard library function shall not access objects indirectly accessible via its
arguments or via elements of its container arguments except by invoking functions
required by its specification on those container elements.
Operations on iterators obtained by calling a standard library container or string
member function may access the underlying container, but shall not modify it.
Unless otherwise specified, C++ standard library functions shall perform all operations
solely within the current thread if those operations have effects that are
visible to users.