Доброго времени суток!
Возникла у меня непонятка при попытке использовать decltype с элементами structured bindings.
Суть вопроса показана в следующем примерчике:
http://coliru.stacked-crooked.com/a/655de107a169d6b2
#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
}
Выходит, что два показанные объявления обладают разным поведением, но неразличимы на уровне типов (и это меня огорчает).
Меня интересует, где находится то место в стандарте, где говорится, что decltype должен работать именно так для элементов structured bindings. Что-то не нахожу я.