Reading an object designated by a
volatile glvalue (
[basic.lval]),
modifying an object,
producing an injected declaration (
[expr.const]),
calling a library I/O function, or
calling a function that does any of those operations
are all
side effects,
which are changes in the state of the execution or translation environment
. Evaluation of an expression (or a
subexpression) in general includes both value computations (including
determining the identity of an object for glvalue evaluation and fetching
a value previously assigned to an object for prvalue evaluation) and
initiation of side effects
. When a call to a library I/O function
returns or an access through a volatile glvalue is evaluated, the side
effect is considered complete, even though some external actions implied
by the call (such as the I/O itself) or by the
volatile access
may not have completed yet
.