B.1 – Введение в C++11
Что такое C++11?
12 августа 2011 года ISO (Международная организация по стандартизации) одобрила новую версию C++, получившую название C++11. C++11 добавляет к языку C++ совершенно новый набор функциональных возможностей! Использование этого нового функционала совершенно необязательно, но вы, несомненно, найдете некоторое из него полезным. Все предыдущие руководства были обновлены, чтобы соответствовать C++11.
Цели C++11
Бьёрн Страуструп охарактеризовал цели C++11 так:
- Развивать сильные стороны C++ – вместо того, чтобы пытаться распространить C++ на новые области, где он может быть слабее (например, приложения Windows с тяжелым графическим интерфейсом), сосредоточиться на том, чтобы заставить его делать то, что у него хорошо получается, еще лучше.
- Сделать C++ более простым в изучении и использовании – предоставить функциональные возможности, которые делают язык более последовательным и простым в использовании.
С этой целью комитет, согласовавший стандарт C++11, попытался руководствоваться следующими общими принципами:
- По возможности сохранить стабильность и совместимость со старыми версиями C++ и C. Программы, работавшие на C++03, как правило, должны работать и на C++11.
- Свести количество расширений ядра языка к минимуму и поместить основную часть изменений в стандартную библиотеку (цель, которая в этом обновлении не была достигнута);
- Сосредоточиться на улучшении механизмов абстракции (классы, шаблоны), а не на добавлении механизмов для обработки конкретных ситуаций.
- Добавить новую функциональность как для новичков, так и для экспертов. Понемногу для всех!
- Повышение безопасности типов, чтобы предотвратить непреднамеренные ошибки.
- Повысить производительность и позволить C++ работать с оборудованием напрямую.
- Учитывать удобство использования и проблемы экосистемы. C++ должен хорошо работать с другими инструментами, быть простым в использовании и обучении и т.д.
C++11 не сильно отличается от C++03 в тематическом плане, но он добавил огромное количество нового функционала.
Основные нововведения в C++11
Вот список основных функций, добавленных в C++11. Обратите внимание, что этот список не является исчерпывающим, а скорее предназначен для выделения некоторых ключевых интересных особенностей.
auto
(8.7 – Вывод типов для объектов с использованием ключевого словаauto
);char16_t
иchar32_t
и новые литералы для их поддержки;constexpr
(4.14 –const
,constexpr
и символьные константы);decltype
;- спецификатор
default
; - делегирующие конструкторы (12.8 – Перекрывающиеся и делегирующие конструкторы);
- спецификатор
delete
(13.14 – Конструктор преобразования,explicit
иdelete
); - классы
enum
(9.3 – Классы перечислений); - внешние шаблоны;
- лямбда-выражения (11.13 – Введение в лямбды (анонимные функции)) и захваты (11.14 – Лямбда-захваты);
long long int
(4.3 – Размеры объектов и операторsizeof
);- конструктор и присваивание перемещения (M.3 – Конструкторы перемещения и присваивание перемещением);
- спецификатор
noexcept
(краткое упоминание в 20.4 – Неперехваченные исключения и универсальные обработчики); nullptr
(10.9 – Нулевые указатели);- спецификаторы
override
иfinal
(18.3 – Спецификаторы override и final, и ковариантные возвращаемые типы); - циклы
for
на основе диапазона (10.19 – Циклыfor
-each (циклы на основе диапазона)); - ссылки на r-значения (M.2 – Ссылки на r-значения (rvalue-ссылки));
static_assert
(7.17 –assert
иstatic_assert
);std::initializer_list
(16.7 – Список инициализаторовstd::initializer_list
);- синтаксис, завершающийся возвращаемым типом (8.7 – Вывод типов для объектов с использованием ключевого слова
auto
); - псевдонимы типов (8.6 –
typedef
и псевдонимы типов); typedef
теперь может определять тип шаблонных классов;- унифицированная инициализация (4.1 – Введение в основные типы данных);
- определяемые пользователем литералы;
- вариативные шаблоны;
>>
теперь будет правильно интерпретироваться как закрытие объекта шаблона.
В стандартной библиотеке C++ также появилось много новых классов, доступных для использования.
- лучшая поддержка многопоточности и локального хранилища потоков;
- хеш-таблицы;
- улучшения генерирования случайных чисел (основное обсуждение в 9.5 – Генерирование случайных чисел);
- обертки ссылок (18.9 – Нарезка объектов);
- регулярные выражения;
std::auto_ptr
устарел (M.1 – Введение в умные указатели и семантику перемещения);std::tuple
(краткое упоминание в 11.5 – Возвращение значений по значению, по ссылке и по адресу);std::unique_ptr
(M.6 –std::unique_ptr
)
.