суббота, 29 апреля 2017 г.

[prog.memories] Немало времени требуется, чтобы использование фич языка вошло в привычку

C++11 вышел уже очень давно, скоро появится C++17 и C++11 начнет терять свою актуальность. Тем не менее, есть несколько фич C++11, к повседневному использованию которых лично я пока еще не пришел. В первую очередь это касается final и noexcept, а так же, отчасти, constexpr.

В этой связи мне вспоминается, как году эдак в 1993-ем или 1994-ом заставлял себя использовать const-ы для определения типов параметров функций/методов. Ведь начинали мы в 1991-ом с обычного C, который даже C89, наверное, не был. Основным инструментом был Turbo C 2.0 выпуска 1988-го года. Поэтому писать в стиле int mystrlen(const char *) тогда было не принято. Тем не менее, со временем сумел выработать у себя привычку использовать const для обозначения неизменяемых аргументов-указателей и аргументов-ссылок. Что в последствии неоднократно помогало.

Затем точно так же приходилось приучать себя к использованию const для отметки константных методов в классах. Вещь полезная, но к ней нужно привыкнуть, чтобы сразу же заставлять себя задумываться о том, должен ли метод быть константным или неконстантным.

Потом, когда компиляторы начали более-менее поддерживать C++98, пытался приобщиться к спецификации исключений в C++98. Ну это которая через throw(A,B,C) делалась. Тут, правда, не шибко хорошо пошло. Ибо быстро выяснилось, что в C++ важно просто знать, бросаются ли исключения вообще, а вот от их точного перечня пользы не было. Скорее даже один вред. Поэтому где-то еще, наверное, живет старый код, в котором используется throw(). Но писать в таком стиле в привычку не вошло.

А вот с C++11 получилось любопытно. Какие-то вещи, вроде лямбд, rvalue references и variadic templates практически сразу же начали использоваться. Что называется легко и непринужденно. Тогда как final, noexcept и constexpr оставались где-то в стороне. В первую очередь потому, что приходилось оглядываться на VC++, в котором с noexcept и constexpr до недавнего времени было совсем плохо. Да и вообще C++11 по сравнению с C++98 очень сильно изменился, поэтому потребовалось приличное время, чтобы в голове все это уложилось.

Тем не менее, потихоньку ловлю себя на том, что уже задумываюсь, а будет ли класс/структура расширяться в будущем? Может стоит ее сразу пометить как final? Или может ли метод в принципе бросать исключения? А если не может, то почему же я не обозначаю его как noexcept. Ну и т.д. Потихоньку, но процесс идет. Глядишь, к выходу C++20 совсем уже хорошо освоюсь с фичами C++11 и, может быть, даже с фичами C++14 :)

Комментариев нет: