For all three decomposition kinds, the elements are resolved in lexical order, and each is fully completed before the next is evaluated.
For a using-marked element that means: read from
e, write via operator=, and only then move
on.
Without using, every element of
auto& [x, y] = arr; is a reference binding into
e — and binding a reference has no side effect.
Expands to
using replaces that binding with an assignment through
operator=, and an assignment is
observable:
Read left to right, this is an evict-and-shift. Under any other
order, arr is silently corrupted.
Tuple-like decomposition gets this ordering for free: each element is a separately-initialised variable, sequenced by ordinary declaration semantics.
Array and aggregate never needed a guarantee, because they never had a side effect to order.
This rule generalises the existing guarantee to the two forms that lacked it