Otherwise, if
the
qualified-id std::tuple_size<E>
names a complete class type with a member named
value,
the expression
std::tuple_size<E>::value
shall be a well-formed integral constant expression
and
the number of elements in
the
identifier-list shall be equal to the value of that
expression
. Let
i be an index prvalue of type
std::size_t
corresponding to
vi. If a search for the name
get
in the scope of
E (
[class.member.lookup])
finds at least one declaration
that is a function template whose first template parameter
is a non-type parameter,
the initializer is
e.get<i>(). Otherwise, the initializer is
get<i>(e),
where
get undergoes argument-dependent lookup (
[basic.lookup.argdep])
.
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 and
the type Ui designated by
either Ti& or Ti&&,
where Ui is an lvalue reference if
the initializer is an lvalue and an rvalue reference otherwise,
variables are introduced with unique names ri as follows: