Created on 2026-01-14.00:00:00 last changed 4 weeks ago
Proposed resolution (approved by CWG 2026-01-23):
Change in 8.7 [stmt.expand] bullet 5.3 as follows:
... where N is the structured binding size of the type of
the expansion-initializer and Si is
{
for-range-declaration = ui vi;
compound-statement
}
If the expansion-initializer is an lvalue, then
vi is ui; otherwise, vi is
static_cast<decltype(ui)&&>(ui).
[Accepted at the March, 2026 meeting.]
(From submission #835.)
Consider:
auto f() -> std::tuple<int, int&, int&&>;
auto g() -> void {
template for (auto&& elem : f()) {
;
}
}
The type of elem is int& in each iteration, but the intent of P1306R5 was that the first and third iteration yield int&& instead.
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2026-04-17 22:17:22 | admin | set | status: ready -> accepted |
| 2026-03-27 13:08:23 | admin | set | status: tentatively ready -> ready |
| 2026-02-21 09:24:24 | admin | set | status: open -> tentatively ready |
| 2026-01-21 21:28:50 | admin | set | messages: + msg8457 |
| 2026-01-14 00:00:00 | admin | create | |