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

Сообщение Re[3]: Структурное связывание от 02.10.2023 16:22

Изменено 02.10.2023 16:27 Кодт

Re[3]: Структурное связывание
Здравствуйте, B0FEE664, Вы писали:

BFE>Для меня просто было неожиданностью, что

BFE>auto a = ...
BFE>и
BFE>auto [b] = ...
BFE>так различаются.

BFE>Я бы ожидал такое:

BFE>auto [b] = ... // копия поля
BFE>auto [&b] = ... // ссылка на поле

На этом основывалась дырка в 17 стандарте, не позволявшая делать захват таких полей в лямбду
auto [x, y] = foo();

[x]() {} ();

В 20 разрешили.
Re[3]: Структурное связывание
Здравствуйте, B0FEE664, Вы писали:

BFE>Для меня просто было неожиданностью, что

BFE>auto a = ...
BFE>и
BFE>auto [b] = ...
BFE>так различаются.

BFE>Я бы ожидал такое:

BFE>auto [b] = ... // копия поля
BFE>auto [&b] = ... // ссылка на поле

На этом основывалась дырка в 17 стандарте, не позволявшая делать захват таких полей в лямбду
auto [x, y] = foo();

[x]() {} ();

В 20 разрешили.

Ну и, конечно же, — да, синтаксис непрозрачный.
Фактически, там
auto hidden = foo();
decltype(auto) x = std::get<0>(hidden);
decltype(auto) y = std::get<1>(hidden);

и, при желании, эти геттеры могут возвращать вообще что угодно.

По красоте, надо было бы делать такой синтаксис
[auto x, auto& y] = foo();

но тогда мы бы сразу попали на то, что результат функции непонятно как сохранять и с каким временем жизни. И как это отразится на времени жизни переменных.
Поэтому своя специфическая логика в этом, конечно, есть.