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

Сообщение Re[7]: Не распарсил конструкцию с [] от 30.01.2022 17:36

Изменено 30.01.2022 20:26 Андрей Тарасевич

Re[7]: Не распарсил конструкцию с []
Здравствуйте, AlexGin, Вы писали:

AG>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>[&, i] — допустимо. Общий захват — по ссылке, i — по значению.

АТ>>[&, &i] — ошибка. Нельзя захватывать i по ссылке, если общий захват и так по ссылке.
АТ>>[=, i] — ошибка. Нельзя захватывать i по значению, если общий захват и так по значению.
АТ>>[=, &i] — допустимо. Общий захват — по значению, i — по ссылке.

АТ>>http://eel.is/c++draft/expr.prim.lambda#capture-2

АТ>>http://coliru.stacked-crooked.com/a/9fd6075650e3b6b8

AG>Мне хорошо запомнилась статья на "хабре", которую использую уже несколько лет, в качестве руководства:

AG>https://habr.com/ru/post/66021

Статья по ссылке содержит ту же ошибку:

[&, x, &y]              // захват всех переменных по ссылке, кроме x…


Нет, так в С++ не разрешается.

Возможно дело в том, что статься писалась в 2009, то есть до выхода финальной версии стандарта и в черновике подобное еще допускалось. Как я сказал выше, это выглядит как вполне логичная возможность. Меня удивляет, что ее запретили. Интересно было бы узнать, почему.

---

Порылся в черновиках: нет, даже самые ранние версии черновика С++11, в которых уже появилось описание лямбда-выражений (N2588, 2008 год), сразу запрещали такую избыточность в захватах. То есть статья на хабре по-видимому писалась очередным "практиком" и любителем "де факто", изучавшим С++ по разудалому творчеству GNU-шных студентов: GCC по умолчанию рапортует эту ошибку через "warning".

Опять же, мне это ограничение кажется странным (как, видать, и "GNU-шных студентам"). Интересно было бы узнать, почему его ввели.
Re[7]: Не распарсил конструкцию с []
Здравствуйте, AlexGin, Вы писали:

AG>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>[&, i] — допустимо. Общий захват — по ссылке, i — по значению.

АТ>>[&, &i] — ошибка. Нельзя захватывать i по ссылке, если общий захват и так по ссылке.
АТ>>[=, i] — ошибка. Нельзя захватывать i по значению, если общий захват и так по значению.
АТ>>[=, &i] — допустимо. Общий захват — по значению, i — по ссылке.

АТ>>http://eel.is/c++draft/expr.prim.lambda#capture-2

АТ>>http://coliru.stacked-crooked.com/a/9fd6075650e3b6b8

AG>Мне хорошо запомнилась статья на "хабре", которую использую уже несколько лет, в качестве руководства:

AG>https://habr.com/ru/post/66021

Статья по ссылке содержит ту же ошибку:

[&, x, &y]              // захват всех переменных по ссылке, кроме x…


Нет, так в С++ не разрешается.

Возможно дело в том, что статься писалась в 2009, то есть до выхода финальной версии стандарта и в черновике подобное еще допускалось. Как я сказал выше, это выглядит как вполне логичная возможность. Меня удивляет, что ее запретили. Интересно было бы узнать, почему.

---

Порылся в черновиках: нет, даже самые ранние версии черновика С++11, в которых уже появилось описание лямбда-выражений (N2588, 2008 год), сразу запрещали такую избыточность в захватах. То есть статья на хабре по-видимому писалась очередным "практиком" и любителем "де факто", изучавшим С++ по разудалому творчеству GNU-шных студентов: GCC по умолчанию рапортует эту ошибку через "warning".

Опять же, мне это ограничение кажется странным (как, видать, и "GNU-шным студентам").