Информация об изменениях

Сообщение Structured bindings и decltype от 07.12.2024 18:57

Изменено 07.12.2024 18:57 rg45

Structured bindings и decltype
Доброго времени суток!

Возникла у меня непонятка при попытке использовать decltype с элементами structured bindings.

Суть вопроса показана в следующем примерчике:

http://coliru.stacked-crooked.com/a/655de107a169d6b2

[/cpp]
#include <concepts>
#include <iostream>

int main()
{
int a[2] {10, 20};

auto [x, y] = a;
auto& [xr, yr] = a;
auto& r = a[0]; // Заведем рядом обычную ссылку, для сравнения

static_assert(std::same_as<int&, decltype(r)>); // int& — Вопросов нет.
static_assert(std::same_as<int, decltype(x)>); // int — Тоже понятно.
static_assert(std::same_as<int, decltype(xr)>); // Тоже int! А вот тут удивляюсь

// При этом xr и уr ведут себя как ссылки, как и ожидается:
xr *= 10;
yr *= 10;
std::cout << a[0] << ", " << a[1] << std::endl; // -> 100, 200
}
[cpp]

Выходит, что два показанные объявления обладают разным поведением но нераличимы на уровне типов (и это меня огорчает). Меня интересует, где находится то место в стандарте, где говорится, что decltype должен работать именно так для элементов structured bindings.