С++ многими рассматривается как многословный язык. И хотя само по себе понятие "многословный" весьма субъективно, но если сравнить C++ с более молодыми конкурентами, вроде Rust или Go, но некая многословность таки заметна невооруженным взглядом: всякие template, typename, virtual, override, noexcept и т.д., и т.п.
У меня отношение к многословности C++ специфическое: да, она имеет место быть и на небольших фрагментах кода она может раздражать. Однако, когда приходится целый день копаться в простынях незнакомого кода, то все эти бросающиеся в глаза template, typename, virtual, override, noexcept и пр. начинают восприниматься как благо: хоть какие-то проблесковые огоньки в сплошном потоке.
А давеча столкнулся с ситуацией, в которой C++ мне показался недостаточно многословным.
Обнаружил в коде, написанном больше года назад, классическую для C++ ошибку: повисшую ссылку. Лямбда захватывала ссылку на объект, который жил внутри контейнера. В качестве контейнера был std::vector и, естественно, когда что-то из контейнера удалялось, то захваченная ссылка оказывалась невалидной.
Как это все проработало столько времени и не попалось на глаза раньше совершенно непонятно, ну да не в этом суть.
Суть же в том, что найдя и исправив проблемную лямбду, я захотел проверить и остальные лямбды. Вдруг в какой-то из них есть аналогичная бяка, но пока не проявившаяся.
И вот тут-то встал вопрос: а как по коду быстро и точно разыскать все лямбды?
Вот было бы в C++ ключевое слово lambda для определения лямбда-функции, было бы проще.
Но такого ключевого слова нет.
Жаль, как по мне. Будь такое ключевое слово (или какой-то специальный символ, скажем @), то код на современном C++, в котором, местами, лямбда на лямбде и лямбдой погоняет, читался бы проще. ИМХО, конечно же.
Есть ли у этого потока сознания какой-то сухой остаток? Вряд ли.
Разве что кто-то хочет создать современную замену C++ (ну не ограничиваться же Circle, Carbon, Val и cppfront, в самом-то деле) и задумается стоит делать эту самую замену настолько же лаконичной, как вышеупомянутый Rust?
1 комментарий:
@SiGMan
Лень экспериментировать, но мне думается, что это не будет работать на:
лямдах, декларация которых разбита на несколько строк;
лямбдах с ключевым словом mutable;
лямбдах с явно заданным типом результирующего значения.
Ну и еще интересны случаи вроде:
[v=a[0]](...) {...}
[](int (*pfn)(int, int)) {...}
Отправить комментарий