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

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

Изменено 07.12.2024 19:08 rg45

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

Возникла у меня непонятка при попытке использовать 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. Что-то не нахожу я.
Structured bindings и decltype
Доброго времени суток!

Возникла у меня непонятка при попытке использовать 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. Что-то не нахожу я.