- Title
- Redeclaration of structured binding reference variables
- Status
- cd5
- Section
- 9.7 [dcl.struct.bind]
- Submitter
- Richard Smith
Created on 2016-08-12.00:00:00 last changed 69 months ago
Messages
Date: 2017-08-15.00:00:00
Proposed resolution (August, 2017): Change 9.7 [dcl.struct.bind] paragraph 3 as follows:
Otherwise, if the qualified-id std::tuple_size<E>
names a complete type, 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. The unqualified-id get is looked up in the
scope of E by class member access lookup
(_N4868_.6.5.6 [basic.lookup.classref]), and if that finds at least one declaration,
the initializer is e.get<i>() . Otherwise, the initializer
is get<i>(e) where get is looked up in the associated
namespaces (6.5.4 [basic.lookup.argdep]). In either case,
get<i> is interpreted as a template-id. [Note:
Ordinary unqualified lookup (6.5.3 [basic.lookup.unqual]) is not performed.
—end note] 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 T i designated
by std::tuple_element<i, E>::type ,
each v i is a variable
variables are introduced with unique
names r i of type “reference
to T i ” initialized with the initializer
(9.5.4 [dcl.init.ref]), where the reference is an lvalue
reference if the initializer is an lvalue and an rvalue reference
otherwise. Each v i is the name of an lvalue
of type T i that refers to the object bound
to r i; the referenced type
is T i.
Date: 2017-11-15.00:00:00
[Accepted as a DR at the November, 2017 meeting.] According to the current rules for structured binding declarations,
the user-defined case declares the bindings as variables of reference
type. This presumably makes an example like the following valid: This seems unreasonable, especially in light of the fact that it only
works for the user-defined case and not the built-in case (where the
bindings are not modeled as references).
auto [a] = std::tuple<int>(0);
extern int &&a; // ok, redeclaration, could even be in a different TU
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2020-12-15 00:00:00 | admin | set | status: dr -> cd5 |
| 2018-02-27 00:00:00 | admin | set | messages: + msg6116 |
| 2016-08-12 00:00:00 | admin | create | |