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, each vi
is a variable of type “reference to Ti” initialized with the
initializer, where the reference is an lvalue reference if the initializer is
an lvalue and an rvalue reference otherwise; 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, .