вторник, 31 января 2023 г.

[prog.c++] Местами C++ недостаточно многословен для меня

С++ многими рассматривается как многословный язык. И хотя само по себе понятие "многословный" весьма субъективно, но если сравнить 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 комментарий:

eao197 комментирует...

@SiGMan

Лень экспериментировать, но мне думается, что это не будет работать на:

лямдах, декларация которых разбита на несколько строк;

лямбдах с ключевым словом mutable;

лямбдах с явно заданным типом результирующего значения.

Ну и еще интересны случаи вроде:

[v=a[0]](...) {...}

[](int (*pfn)(int, int)) {...}