C++11
C++11 — вторая крупная версия C++ и самое важное обновление со времён C++98. Было внесено большое количество изменений как для стандартизации существующих практик, так и для улучшения абстракций, доступных программистам на C++.
До окончательного утверждения ISO 12 августа 2011 года использовалось название «C++0x», поскольку ожидалось, что стандарт будет опубликован до 2010 года. Между C++03 и C++11 прошло 8 лет — на данный момент это самый длительный интервал между версиями. С тех пор обновления C++ регулярно выходят каждые 3 года.
В C++11 вошли следующие возможности:
- Из TR1: всё содержимое TR1, кроме специальных функций.
- Из Boost: библиотека потоков,
exception_ptr,error_codeиerror_condition, улучшения для итераторов (begin,end,next,prev) - Из C: функции преобразования Unicode в стиле C
Возможности основного языка
-
autoиdecltype - функции по умолчанию и удалённые функции
-
finalиoverride - возвращаемый тип в конце объявления
- ссылки на rvalue
- конструкторы перемещения и операторы присваивания перемещением
- перечисления с областью видимости
-
constexprи литеральные типы - инициализация списком
- делегирующие и наследуемые конструкторы
- инициализаторы в фигурных скобках или через знак равенства
nullptrlong long- char16_t и char32_t
- псевдонимы типов
- вариативные шаблоны
- обобщённые (нетривиальные) объединения
- обобщённые POD-типы (тривиальные типы и типы со стандартной компоновкой)
- строковые литералы Unicode
- пользовательские литералы
- атрибуты
- лямбда-выражения
-
спецификатор
noexceptи операторnoexcept -
alignofиalignas - модель памяти для многопоточных программ
- локальное хранилище для потоков
- интерфейс сборщика мусора (удалён в C++23)
- цикл for по диапазону (на основе библиотеки Boost)
-
static_assert(на основе библиотеки Boost)
Возможности библиотеки
Заголовочные файлы
<array><atomic><cfenv><chrono><cinttypes><condition_variable><cstdint><cuchar><forward_list><future><initializer_list><mutex><random><ratio><regex><scoped_allocator><system_error><thread><tuple><typeindex><type_traits><unordered_map><unordered_set>
Возможности библиотеки
- библиотека поддержки параллелизма
-
emplace()и другие случаи использования ссылок на rvalue во всех частях существующей библиотеки std::unique_ptrstd::move_iteratorstd::initializer_list- состояния и ограниченные областью действия аллокаторы
std::forward_list- библиотека chrono
- библиотека ratio
- новые алгоритмы:
-
std::all_of,std::any_of,std::none_of, -
std::find_if_not, -
std::copy_if,std::copy_n, -
std::move,std::move_backward, -
std::random_shuffle,std::shuffle, -
std::is_partitioned,std::partition_copy,std::partition_point, -
std::is_sorted,std::is_sorted_until, -
std::is_heap,std::is_heap_until, -
std::minmax,std::minmax_element, -
std::is_permutation, -
std::iota, std::uninitialized_copy_n- фасеты преобразования Unicode, не зависящие от локали
std::functionstd::exception_ptr-
std::error_codeиstd::error_condition - улучшения для итераторов:
- функции преобразования Unicode
Отчёты об ошибках
| Отчёты об ошибках, исправленные в C++11 (741 для ядра, 868 для библиотеки) |
|---|
|
Поддержка компилятора
Основные языковые возможности C++11
| Возможность C++11 | Документ(ы) |
GCC |
Clang |
MSVC |
Apple Clang |
EDG eccp |
Intel C++ |
Nvidia HPC C++ (ранее PGI)* |
Nvidia nvcc |
Cray |
Embarcadero C++ Builder |
IBM Open XL C++ for AIX |
IBM Open XL C++ for z/OS |
IBM XL C++ |
Sun/Oracle C++ |
HP aCC |
Digital Mars C++ | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Препроцессор C99 препроцессор | N1653 | 4.3 | Да |
19.0 (2015)* (частично)* 19.26* | Да | 4.1 | 11.1 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 10.1 | 5.9 | A.06.25 | Да | |
static_assert (FTM)* | N1720 | 4.3 | 2.9 | 16.0* | Да | 4.1 | 11.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 11.1 | 5.13 | A.06.25 | 8.52 | |
| Угловые скобки в правом контексте | N1757 | 4.3 | Да | 14.0* | Да | 4.1 | 11.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 12.1 | 5.13 | |||
Расширенные объявления friend | N1791 | 4.7 | 2.9 | 16.0* | Да | 4.1 | 11.1 (частично) 12.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 11.1 | 5.13 | A.06.25 | ||
long long | N1811 | Да | Да | 14.0* | Да | Да | Да | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | Да | Да | Да | Да | |
auto | N1984 | 4.4 | Да | 16.0* | Да | 3.9 | 11.0 (частично)* 12.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 11.1 | 5.13 | A.06.25 | ||
| Делегирующие конструкторы (FTM)* | N1986 | 4.7 | 3.0 | 18.0* | Да | 4.7 | 14.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 11.1 | 5.13 | A.06.28 | ||
| externtemplate | N1987 | 3.3 | Да | 12.0* | Да | 3.9 | 9.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 11.1 | 5.13 | A.06.25 | ||
constexpr (FTM)* | N2235 | 4.6 | 3.1 | 19.0 (2015)* | Да | 4.6 | 13.0 (частично) 14.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 12.1 (частично) 13.1 | 5.13 | A.06.28 | ||
char16_t и char32_t (FTM)* | N2249 | 4.4 | 2.9 | 19.0 (2015)* | Да | 4.4 |
12.1 (частично)* 14.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.1* | 5.13 | A.06.27 | 8.52 | |
| Поддержка компилятором типовых свойств. N2255* |
N2255 N2984 N3142 |
4.3 (частично)* 4.8 (частично)* 5 | 3.0 |
14.0* (частично)* 19.0 (2015)* | Да | 4.0 | 10.0 | 2015 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.3 | 5.13 | 6.16 | |||
| Псевдонимы шаблонов (FTM)* | N2258 | 4.7 | 3.0 | 18.0* | Да | 4.2 | 12.1 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.1* | 5.13 | A.06.27 | ||
alignas | N2341 | 4.8 | 3.0 | 19.0 (2015)* | Да | 4.8 | 15.0 | 2015 | 7.0 | 8.6 | Да | 17.1.0 | 1.1.0 | 13.1.2* | 5.13 | |||
alignof | N2341 | 4.5 | 2.9 | 19.0 (2015)* | Да | 4.8 | 15.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.2* | 5.13 | |||
| Функции, определяемые по умолчанию и удалённые функции | N2346 | 4.4 | 3.0 | 18.0* | Да | 4.1 | 12.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1 | 5.13 | A.06.25 | ||
Строго типизированные enum | N2347 | 4.4 | 2.9 |
16.0* (частично) 17.0* | Да | 4.0 | 13.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 12.1 | 5.13 | A.06.25 | ||
| Атомарные операции | N2427 | 4.4 | 3.1 | 17.0* | Да | Да | 13.0 | 2015 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.2* | 5.14 |
nullptr | N2431 | 4.6 | 2.9 | 16.0* | Да | 4.2 | 12.1 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1 | 5.13 | A.06.27 | 8.52 |
| Явные операторы преобразования | N2437 | 4.5 | 3.0 | 18.0* | Да | 4.4 | 13.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 12.1 | 5.13 | A.06.27 | |
| ref-квалификаторы (FTM)* | N2439 | 4.8.1 | 2.9 | 19.0 (2015)* | Да | 4.7 | 14.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.2* | 5.13 | A.06.28 | |
| Строковые литералы Unicode (FTM)* | N2442 | 4.4 | 3.0 | 19.0 (2015)* | Да | 4.7 | 11.0* | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 |
10.1* 13.1.1* | 5.7 | A.06.28 | 8.52 |
| Литералы сырых строк (FTM)* | N2442 | 4.5 | Да | 18.0* | Да | 4.7 | 14.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.1, кроме AIX xlC 13.1.3* | 5.13 | A.06.28 | 8.52 |
| Встроенные пространства имён | N2535 | 4.4 | 2.9 | 19.0 (2015)* | Да | 4.5 | 14.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 11.1 | 5.13 | A.06.28 | |
| Наследуемые конструкторы (FTM)* | N2540 | 4.8 | 3.3 | 19.0 (2015)* | Да | 4.8 | 15.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.1* | 5.13 | ||
| Типы возвращаемого значения функции в конечном синтаксисе | N2541 | 4.4 | 2.9 | 16.0* | Да | 4.1 | 12.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 12.1 | 5.13 | A.06.27 | |
Объединения без ограничений unions | N2544 | 4.6 | 3.0 | 19.0 (2015)* | Да | 4.6 | 14.0* | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.2* | 5.13 | A.06.28 | |
| Вариативные шаблоны (FTM)* |
N2242 N2555 | 4.3 (частично)* 4.4 | 2.9 | 18.0* | Да | 4.3 (частично)* 4.3 | 12.1 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 11.1 (частично)* | 5.13 | A.06.27 | |
| SFINAE для выражений | N2634 | 4.4 | 2.9 | 19.14* | Да | 4.2 | 12.1 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | ||||
| Локальные и безымянные типы в качестве параметров шаблона | N2657 | 4.5 | 2.9 | 16.0* | Да | 4.2 | 12.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.2* | 5.13 | A.06.27 | |
| Потоковое локальное хранилище | N2659 | 4.4 (частично) 4.8 | 3.3* |
16.0* (частично) 19.0 (2015)* | Да | 4.8 | 11.1 (частично) 15.0* | 2015 | 8.4 | Да | 17.1.0 | 1.1.0 |
10.1 (частично)* 13.1.2 (частично)* | 5.9 (частично) | 8.52 (частично) | ||
| Динамическая инициализация и уничтожение с поддержкой параллельного выполнения (магические статические переменные) (FTM)* | N2660 | 4.3 | 2.9 | 19.0 (2015)* | Да | Да | 11.1* | 2015 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.2* | 5.13 | A.06.25 | ||
| Сборка мусора и обнаружение утечек на основе достижимости | N2670 | ||||||||||||||||
| Списки инициализации (FTM)* | N2672 | 4.4 | 3.1 | 18.0* | Да | 4.5 | 13.0 (частично) 14.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.2* | 5.13 | A.06.28 | |
| Инициализаторы нестатических членов данных (FTM)* | N2756 | 4.7 | 3.0 | 18.0* | Да | 4.6 | 14.0 | 2015 | 7.0 | 8.4 | Да | 17.1.0 | 1.1.0 | 13.1.2* | 5.13 | A.06.28 |
Атрибуты, [[noreturn]] (FTM)* | N2761 | 4.8 | 3.3 | 19.0 (2015)* | Yes | 4.2 | 12.1 | 2015 | 7.0 | 8.4 | Yes | 17.1.0 | 1.1.0 | 13.1.1* | 5.13 | A.06.27 | |
[[carries_dependency]] |
N2556 N2643 | 3.3* | 17.1.0* | ||||||||||||||
Предварительные (неполные) объявления enum | N2764 | 4.6 | 3.1 | 17.0* | Yes | 4.5 | 11.1 (частично) 14.0 | 2015 | 7.0 | 8.4 | Yes | 17.1.0 | 1.1.0 | 12.1 | 5.13 | ||
| Литералы, определяемые пользователем (FTM)* | N2765 | 4.7 | 3.1 | 19.0 (2015)* | Yes | 4.8 | 15.0 | 2015 | 7.0 | 8.4 | Yes | 17.1.0 | 1.1.0 | 13.1.2* | 5.14 | ||
| Rvalue-ссылки (FTM)* |
N2118 N2844 CWG1138 | 4.3 (частично)* 4.5 | 2.9 |
16.0* (частично)* 17.0* | Yes | 4.5 | 11.1 (частично)* 12.0 (частично)* 14.0 | 2015 | 7.0* | 8.4 | Yes | 17.1.0 | 1.1.0 | 12.1 | 5.13 | A.06.25 | |
| Лямбда-выражения (FTM)* |
N2550 N2658 N2927 | 4.5 | 3.1 |
16.0* (частично)* 17.0* | Yes | 4.1 | 12.0 | 2015 | 7.0 | 8.4 | Yes | 17.1.0 | 1.1.0 | 13.1.2* | 5.13 | A.06.25 | |
| Цикл range-for (FTM)* |
N2930 N3271 | 4.6 | 3.0 | 17.0* | Yes | 4.5 | 13.0 | 2015 | 7.0 | 8.4 | Yes | 17.1.0 | 1.1.0 | 13.1.2* | 5.13 | A.06.28 | |
noexcept | N3050 | 4.6 | 3.0 | 19.0 (2015)* | Yes | 4.5 | 14.0 | 2015 | 7.0 | 8.4 | Yes | 17.1.0 | 1.1.0 | 13.1.1* | 5.13 | A.06.28 | |
| Перемещающие специальные функции-члены, объявленные по умолчанию: специальные функции-члены перемещения | N3053 | 4.6 | 3.0 | 19.0 (2015)* | Yes | 4.5 | 14.0 | 2015 | 7.0 | 8.4 | Yes | 17.1.0 | 1.1.0 | 5.13 | A.06.25 | ||
override и final |
N2928 N3206 N3272 | 4.7 | 2.9 |
14.0* (частично) 17.0* | Yes | 4.8 | 12.0 (частично)* 14.0 | 2015 | 7.0 | 8.4 | Yes | 17.1.0 | 1.1.0 | 13.1.1* | 5.13 | ||
decltype (FTM)* |
N2343 N3276 | 4.3 (частично)* 4.8.1 | 2.9 |
16.0* (частично)* 17.0* | Yes | 4.2 (частично)* 4.8 | 11.0 (частично)* 12.0 | 2015 | 7.0 | 8.4 | Yes | 17.1.0 | 1.1.0 | 11.1 (частично)* | 5.13 | A.06.25 | 8.52 (частично)* |
| Возможность C++11 | Документ(ы) |
GCC |
Clang |
MSVC |
Apple Clang |
EDG eccp |
Intel C++ |
Nvidia HPC C++ (ранее PGI)* |
Nvidia nvcc |
Cray |
Embarcadero C++ Builder |
IBM Open XL C++ for AIX |
IBM Open XL C++ for z/OS |
IBM XL C++ |
Sun/Oracle C++ |
HP aCC |
Digital Mars C++ |
|---|
Возможности библиотеки C++11
| Возможность C++11 | Статья(и) |
GCC libstdc++ |
Clang libc++ |
MSVC STL |
Apple Clang* |
IBM Open XL C/C++ for AIX* |
Sun/Oracle C++* |
Embarcadero C++ Builder* | |
|---|---|---|---|---|---|---|---|---|---|
| Библиотека регулярных выражений | N1429 | 4.9 | 2.8 | Да | Да | 17.1.0 | |||
| Характеристики типов. N1836* |
N1836 N2240 N2244 N2255 N2342 N2984 N3142 |
4.3 (частично)* 4.8 (частично)* 5 | 3.0 |
14.0* (частично)* 19.0 (2015)* | Да | 17.1.0 | 5.13 | Да | |
Функции-члены cbegin, cend, crbegin и crend контейнеров |
N1913 LWG1192 | 4.3 (частично)* 4.5 | Да* | 16.0* | Да* | 17.1.0 | |||
| Сборка мусора и обнаружение утечек на основе достижимости (поддержка библиотекой) | N2670 | 6 (пустая операция)* | 3.4 (пустая операция)* |
19.0 (2015)* (пустая операция)* | Да (пустая операция)* | 17.1.0 | |||
| Манипуляторы ввода-вывода для денежных значений, времени и hexfloat |
N2071 N2072 | 5 | 3.8 | 19.0 (2015)* | Да | 17.1.0 | 5.15 | ||
Запрет COW (копирование при записи) std::basic_string | N2668 | 5 | Да | Да | Да | 17.1.0 | Да | ||
| Возможность C++11 | Статья(и) |
GCC libstdc++ |
Clang libc++ |
MSVC STL |
Apple Clang* |
IBM Open XL C/C++ for AIX* |
Sun/Oracle C++* |
Embarcadero C++ Builder* |
* — наведите указатель на ячейку, отмеченную звёздочкой *, чтобы увидеть дополнительные примечания.
DRnn — число nn после «DR» обозначает целевую редакцию C++, к которой применяется отчёт об ошибке, например DR20 → C++20.
Внешние ссылки
| 1. | C++11 — Википедия |
| 2. | Рабочие примеры C++11 |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/11