Сообщение 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 стандарте, не позволявшая делать захват таких полей в лямбду
В 20 разрешили.
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 стандарте, не позволявшая делать захват таких полей в лямбду
В 20 разрешили.
Ну и, конечно же, — да, синтаксис непрозрачный.
Фактически, там
и, при желании, эти геттеры могут возвращать вообще что угодно.
По красоте, надо было бы делать такой синтаксис
но тогда мы бы сразу попали на то, что результат функции непонятно как сохранять и с каким временем жизни. И как это отразится на времени жизни переменных.
Поэтому своя специфическая логика в этом, конечно, есть.
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();
но тогда мы бы сразу попали на то, что результат функции непонятно как сохранять и с каким временем жизни. И как это отразится на времени жизни переменных.
Поэтому своя специфическая логика в этом, конечно, есть.