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