auto f() -> int(&);
auto [ x, y ] = f(); // x and y refer to elements in a copy of the array return value
auto& [ xr, yr ] = f(); // xr and yr refer to elements in the array referred to by f's return value
names a complete type,
the expression std::tuple_size<E>::value
shall be a well-formed integral constant expression
the number of elements in
the identifier-list shall be equal to the value of that
In either case, e is an lvalue if the type of the entity e
is an lvalue reference and an xvalue otherwise.
Given the type Ti
designated by std::tuple_element<i, E>::type,
variables are introduced with unique names ri
of type “reference to Ti”
initialized with the initializer ([dcl.init.ref]),
where the reference is an lvalue reference if the initializer is
an lvalue and an rvalue reference otherwise.
Each vi is the name of an lvalue of type Ti
that refers to the object bound to ri;
the referenced type is Ti.
Otherwise, all of E's non-static data members shall be public direct
members of E or of the same unambiguous public base class of E,
E shall not have an anonymous union member, and the number of elements
in the identifier-list shall be equal to the number of non-static
data members of E.
Designating the non-static data members of E as
m0, m1, m2, .