От: | B0FEE664 | ||
Дата: | 09.12.24 15:11 | ||
Оценка: | +1 |
Скрытый текст | |
R>Возникла у меня непонятка при попытке использовать decltype с элементами structured bindings. R>Суть вопроса показана в следующем примерчике: R>http://coliru.stacked-crooked.com/a/655de107a169d6b2 R>
R>Выходит, что два показанные объявления обладают разным поведением, но неразличимы на уровне типов (и это меня огорчает). R>Меня интересует, где находится то место в стандарте, где говорится, что decltype должен работать именно так для элементов structured bindings. Что-то не нахожу я. | |
int b[2] {10, 20};
std::pair<int, int&> GetB()
{
return std::pair<int, int&>{b[0], b[1]};
}
int main()
{
//-----------------------------------------------------------
{
auto [b0, b1] = GetB();
static_assert(std::same_as<int, decltype(b0)>);
static_assert(std::same_as<int&, decltype(b1)>);
b0 *= 10;
b1 *= 10;
std::cout << b[0] << ", " << b[1] << std::endl; // -> 10, 200
}
//-----------------------------------------------------------
{
const auto& [rb0, rb1] = GetB(); // const - чтобы продлить время жизни возвращённого объекта
static_assert(std::same_as<const int, decltype(rb0)>);
static_assert(std::same_as<int&, decltype(rb1)>);
//rb0 *= 10; // константа
rb1 *= 10;
std::cout << b[0] << ", " << b[1] << std::endl; // -> 10, 2000
}
//-----------------------------------------------------------
{
const auto [cb0, cb1] = GetB();
static_assert(std::same_as<const int, decltype(cb0)>);
static_assert(std::same_as<int&, decltype(cb1)>); // сюрприз !
//cb0 *= 10;// константа
cb1 *= 10;
std::cout << b[0] << ", " << b[1] << std::endl; // -> 10, 20000
}
}