Полезности современной версии C++

Modern C++ - это в моём понимании всё, что начинается со стандарта C++11. Которому уже, внезапно, аж 9 лет. И вот недавно я решил освежить свои знания этого замечательного ЯП, для чего нашёл и собрал в кучу все интересные лично для меня особенности С++11, C++14 и C++17. Результатом является эта памятка, которая нужна прежде всего именно мне самому для систематизации знаний и в качестве небольшого справочника.

Начнём с нововведений C++11.

1. https://en.cppreference.com/w/cpp/language/static_assert

Начиная с C++11 имеется возможность использовать static_assert (а в C++17 этот механизм упрощён) для проверок на этапе компиляции. А достаточно “умные” среды разработки (например, Visual Studio 2019) делают такие проверки и на этапе редактирования исходного кода.



2. https://en.cppreference.com/w/cpp/language/auto

С помощью автоматического выведения типа можно существенно упростить, например, циклический перебор элементов контейнеров:



3. https://en.cppreference.com/w/cpp/language/function#Deleted_functions

Можно просто и наглядно запретить определённые функции класса, например - дефолтный конструктор.



4. https://en.cppreference.com/w/cpp/language/final

Можно “финализировать” класс или функцию, благодаря чему переопределение или наследование становится невозможным:



5. https://en.cppreference.com/w/cpp/language/override

С помощью ключевого слова override можно явно обозначить намерение переопределения функции. Более строгий контроль за механизмом наследования конечно же полезен.



6. https://en.cppreference.com/w/cpp/language/move_assignment
https://en.cppreference.com/w/cpp/language/move_constructor
https://en.cppreference.com/w/cpp/utility/move

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



7. https://en.cppreference.com/w/cpp/language/enum

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



8. https://en.cppreference.com/w/cpp/language/user_literal

Определяемые пользователем литералы позволяют сделать код более наглядным, спрятав вызов функции за симпатично выглядящим объявлением.



9. https://en.cppreference.com/w/cpp/language/list_initialization

Инициализация списком упрощает инициализацию контейнеров библиотеки STL (и может быть использована для пользовательских классов тоже).



10. https://en.cppreference.com/w/cpp/language/initializer_list#Delegating_constructor

Теперь один конструктор может вызывать другой.



11. https://en.cppreference.com/w/cpp/language/nullptr

Наконец-то никаких больше макросов NULL и инициализации указателей числом. Теперь для этого имеется специальный тип данных.



12. https://en.cppreference.com/w/cpp/language/types#Character_types
https://en.cppreference.com/w/cpp/language/string_literal

Расширенная поддержка юникода на уровне языковых типов и литералов:



13. https://en.cppreference.com/w/cpp/language/lambda

Одно из самых полезных нововведений. Позволяет объявлять функции именно там, где они необходимы. Хотя злоупотреблять этой возможностью я бы не стал.



14. https://en.cppreference.com/w/cpp/language/range-for

Теперь вместо использования индексов и итераторов можно обойтись такой вот простой и аккуратной конструкцией:



15. https://en.cppreference.com/w/cpp/header/array

Появилась более безопасная и удобная замена массиву в стиле C.



16. https://en.cppreference.com/w/cpp/header/random

Для функции получения случайных чисел теперь существует специализированный заголовочный файл, возможности генерации случайных чисел стали существенно более продвинутыми:



17. https://en.cppreference.com/w/cpp/header/regex

Наконец-то регулярные выражения стали частью стандартной библиотеки!



18. https://en.cppreference.com/w/cpp/thread
https://en.cppreference.com/w/cpp/header/thread
https://en.cppreference.com/w/cpp/header/mutex
https://en.cppreference.com/w/cpp/header/condition_variable
https://en.cppreference.com/w/cpp/header/future
https://en.cppreference.com/w/cpp/atomic

Многопоточность теперь поддерживается стандартной библиотекой. Очень полезное нововведение.



Интересных нововведений в C++14 я нашёл две штуки:

19. https://en.cppreference.com/w/cpp/language/integer_literal

Бинарные литералы позволяют писать числа в двоичном виде:



20. Возможность использовать разделитель в числовых литералах:



Нововведений в C++17 больше (плюс к тому - ранее упомянутое упрощение для static_assert).

21. https://en.cppreference.com/w/cpp/language/attributes

Появился атрибут, указывающий на то, что наличие неиспользуемой сущности не является ошибкой. Больше не нужны макросы типа UNUSED.



22. https://en.cppreference.com/w/cpp/language/namespace

Упрощено объявление вложенных неймспейсов:



23. https://en.cppreference.com/w/cpp/utility/any

Специальный тип данных может хранить значение любого типа:



24. https://en.cppreference.com/w/cpp/header/variant

Больше не нужно изобретать свой тип variant, т.к он появился в стандартной библиотеке.



25. https://en.cppreference.com/w/cpp/header/optional

Опциональные аргументы функций и возвращаемые значения.



26. https://en.cppreference.com/w/cpp/header/string_view

Более удобная и безопасная альтернатива строкам в стиле C.



27. https://en.cppreference.com/w/cpp/header/charconv

Ещё один (вроде бы более быстрый) способ преобразования текста в числа и наоборот.



28. https://en.cppreference.com/w/cpp/algorithm/clamp

Простая функция для лимитирования числа по нижней и верхней границе



29. https://en.cppreference.com/w/cpp/header/filesystem

Полноценная поддержка взаимодействия с файловой системой. Очень много полезного, например - получение списка файлов в каталоге.

Comments