Structured bindings и decltype
От: rg45 СССР  
Дата: 07.12.24 18:57
Оценка:
Доброго времени суток!

Возникла у меня непонятка при попытке использовать 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. Что-то не нахожу я.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 07.12.2024 19:08 rg45 . Предыдущая версия . Еще …
Отредактировано 07.12.2024 19:05 rg45 . Предыдущая версия .
Отредактировано 07.12.2024 19:00 rg45 . Предыдущая версия .
Отредактировано 07.12.2024 18:59 rg45 . Предыдущая версия .
Отредактировано 07.12.2024 18:57 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.