C ++ 17 - C++17
Редакции языка C ++ |
---|
C ++ 98 • С ++ 03 • C ++ 11 • C ++ 14 • C ++ 17 • C ++ 20 • C ++ 23 |
C ++ 17 это пересмотр ISO / IEC 14882 стандарт для C ++ язык программирования.
История
До того, как Комитет по стандартам C ++ установил трехлетний цикл выпуска, дата выпуска C ++ 17 была неопределенной. В то время версия C ++ 17 также называлась C ++ 1z, после C ++ 0x или C ++ 1x для C ++ 11 и C ++ 1y для C ++ 14. Спецификация C ++ 17 достигла стадии проекта международного стандарта (DIS) в марте 2017 года.[1][2] Этот DIS был единогласно одобрен, с только редакционными комментариями,[3] а окончательный стандарт был опубликован в декабре 2017 года.[4] В C ++ было внесено несколько изменений. Стандартная библиотека шаблонов хотя некоторые алгоритмы в то <algorithm>
заголовок получили поддержку явных распараллеливание и немного синтаксический были сделаны улучшения.
Удаленный
Эта версия C ++ не только добавила новые функции, но и удалила некоторые из них.
- Удаление триграфы.[5][6]
- Удаление некоторых устаревших типов и функций из стандартная библиотека, включая
std :: auto_ptr
,std :: random_shuffle
, и старые функциональные адаптеры.[7][8] В C ++ 11 они были заменены улучшенными средствами, такими какstd :: unique_ptr
,std :: shuffle
,std :: bind
, и лямбды. - Удаление (ранее устаревшего) использования ключевого слова
регистр
как спецификатор класса хранения.[9] Это ключевое слово сейчас зарезервировано и не используется.
Новые возможности
В C ++ 17 появилось много новых функций. Следующие ниже списки могут быть неполными.
Язык
- Создание текстового сообщения для
static_assert
необязательный[10] - Позволять
typename
(как альтернативаучебный класс
) в параметре шаблона шаблона[11] - Новые правила для
авто
вычитание из списка инициализации в фигурных скобках[12][7] - Определения вложенных пространств имен, например,
пространство имен Икс::Y { … }
вместопространство имен Икс { пространство имен Y { … } }
[7][13] - Разрешение атрибутов для пространства имен и счетчики[14][15]
- Новые стандартные атрибуты
[[провалиться]]
,[[возможно_неиспользованный]]
и[[нодискард]]
[16] - UTF-8 (
u8
) символьные литералы[14][17] (Строковые литералы UTF-8 существуют с C ++ 11; C ++ 17 добавляет соответствующие символьные литералы для согласованности, хотя, поскольку они ограничены одним байтом, они могут хранить только ASCII ) - Шестнадцатеричный плавающая точка литералы[18][19]
- Использование
авто
как тип для параметра шаблона, не являющегося типом[20] - Постоянное вычисление для всех аргументов шаблона, не являющихся типом[14][21]
- Свернуть выражения для вариативные шаблоны[14][22]
- Статический во время компиляции
если
с формойесли constexpr(выражение)
[23] - Структурированные объявления привязки, позволяющие
авто [а, б] = getTwoReturnValues();
[24] - Инициализаторы в
если
ивыключатель
заявления[25] - копирование-инициализация и прямая инициализация объектов типа
Т
из prvalue выражений типаТ
(игнорирование cv-квалификаторов верхнего уровня) не должно приводить к копированию или перемещению конструкторов из выражения prvalue. Видеть копировать элизию для дополнительной информации. - Некоторые расширения при выделении чрезмерно выровненной памяти[26]
- Вывод аргументов шаблона класса (CTAD), введение руководств по выводам конструкторов, например. позволяя
стандартное::пара(5.0, ложный)
вместо того, чтобы требовать явных типов аргументов конструкторастандартное::пара<двойной, bool>(5.0, ложный)
или дополнительная вспомогательная функция шаблонастандартное::make_pair(5.0, ложный)
.[27][28] - Встроенные переменные, которые позволяют определять переменные в файлах заголовков без нарушения одно правило определения. Правила фактически такие же, как встроенные функции
__has_include
, позволяя проверять доступность заголовка с помощью директив препроцессора[29]- Значение
__cplusplus
изменился на201703L
[30] - Спецификации исключений были включены в тип функции[31]
Библиотека
- Большинство основ библиотеки TS I, в том числе:[32][33]
std :: string_view
, не принадлежащая только для чтения ссылка на последовательность символов или струна[34]std :: optional
, для представления необязательные объекты, тип данных, который не всегда может быть возвращен данным алгоритмом с поддержкой невозвратаstd :: any
, для хранения одиночных значений любого типа
std :: uncaught_exceptions
, как заменаstd :: uncaught_exception
в Обработка исключений[35][14]- Новые функции вставки
try_emplace
иinsert_or_assign
заstd :: map
иstd :: unordered_map
ассоциативные структуры данных типа "ключ-значение"[36][37] - Униформа контейнер доступ:
std :: size
,std :: empty
иstd :: data
[37][38] - Определение слова "смежный итераторы "[37][39]
- А файловая система библиотека на основе
boost :: filesystem
[40] - Параллельный версии STL алгоритмы[41]
- Дополнительные математические специальные функции, включая эллиптические интегралы и Функции Бесселя[42]
std :: variant
, а помеченный союз контейнер[43]std :: byte
, позволяя char должны быть заменены на типы данных, предназначенные для моделирования байт данных в виде байта, а не символа[44]- Логические особенности оператора:
std :: конъюнкция
,std :: дизъюнкция
иstd :: отрицание
[45] <memory_resource>
заголовок, для полиморфных ресурсов памяти[46]
Поддержка компилятора
- GCC полностью поддерживает функции языка C ++ 17, начиная с версии 8. [47]
- Лязг 5 и более поздних версий реализованы все возможности C ++ 17.[48]
- Visual Studio 2017 15.8 (MSVC 19.15) поддерживает весь C ++ 17.[49][50]
Поддержка библиотеки
- libstdc ++, начиная с версии 9.1, полностью поддерживает c ++ 17 (8.1 без Parallelism TS и ссылается на C99 вместо C11) [51]
- libc ++ версии 9 частично поддерживает c ++ 17, остальная часть находится в стадии разработки. [52]
- Стандартная библиотека MSVC с 19.15 полностью поддерживает c ++ 17, за исключением «Преобразования элементарных строк» и ссылки на C99 вместо C11.[53]
Смотрите также
Рекомендации
- ^ "Отчет редакции N4661 - Языки программирования - C ++". 21 марта 2017 г.. Получено 2017-03-21.
- ^ «ISO / IEC DIS 14882: Языки программирования - C ++» (PDF). Архивировано из оригинал (PDF) на 2017-03-25.
- ^ Херб Саттер. «C ++ 17 официально одобрен».
- ^ «ISO / IEC 14882: 2017».
- ^ «N3981: Удаление триграфов ??! (Ричард Смит)». 2014-05-06.
- ^ Комментарий IBM о подготовке к будущему, неблагоприятному для Trigraph, в C ++ 17, IBM paper N4210, 2014-10-10. Авторы: Майкл Вонг, Хуберт Тонг, Раджан Бхакта, Дерек Инглис
- ^ а б c «Обновления в отчете о моей поездке».
- ^ «N4190: Удаление auto_ptr, random_shuffle () и старых <функциональных> вещей (Стефан Т. Лававей)».
- ^ "Ключевые слова C ++: регистр".
- ^ "N3928: Расширение static_assert, v2 (Уолтер Э. Браун)" (PDF).
- ^ «N4051: Разрешить typename в параметре шаблона шаблона (Ричард Смит)».
- ^ «N3922: Новые правила автоматического вывода из списка инициализации в фигурных скобках (Джеймс Деннет)».
- ^ «N4230: определение вложенного пространства имен (Роберт Кавулак, Эндрю Томазос)».
- ^ а б c d е «Новые документы по основному языку, принятые для C ++ 17».
- ^ «N4266: Атрибуты для пространств имен и счетчиков (Ричард Смит)».
- ^ «N4640: Рабочий проект стандарта языка программирования C ++» (PDF). С. 193–195.
- ^ «N4267: Добавление символьных литералов u8 (Ричард Смит)».
- ^ Томас Кёппе. «Шестнадцатеричные плавающие литералы для C ++».
- ^ «N4659: Рабочий проект стандарта языка программирования C ++» (PDF). §5.13.4.
- ^ Джеймс Тутон; Майк Спертус (2016-06-23). "Объявление не типовых параметров шаблона с помощью auto".
- ^ «N4268: разрешить постоянную оценку для всех аргументов шаблона, не относящихся к типу (Ричард Смит)».
- ^ «N4295: Складные выражения (Эндрю Саттон, Ричард Смит)».
- ^ «N4659: Рабочий проект стандарта языка программирования C ++» (PDF). §9.4.1.
- ^ «N4659: Рабочий проект стандарта языка программирования C ++» (PDF). §11.5.
- ^ «Операторы выбора с инициализатором».
- ^ «Динамическое выделение памяти для выровненных данных».
- ^ "Вывод аргумента шаблона класса".
- ^ «CppCon 2018: Тимур Думлер» Вывод аргументов шаблона класса в C ++ 17"".
- ^ «N4640: Рабочий проект стандарта языка программирования C ++» (PDF). С. 431–433.
- ^ «N4659: Рабочий проект стандарта языка программирования C ++» (PDF). §19.8.
- ^ "P0012R1: Сделайте спецификации исключений частью системы типов, версия 5".
- ^ "Принять компоненты TS V1" Основы библиотеки "для C ++ 17 (R1)".
- ^ "Текущее состояние".
- ^ "std :: basic_string_view - cppreference.com". en.cppreference.com. Получено 2016-06-23.
- ^ "N4259: Формулировка для std :: uncaught_exceptions (Herb Sutter)" (PDF).
- ^ «N4279: Улучшенный интерфейс вставки карт уникальных ключей (Томас Кёппе)».
- ^ а б c «Новые документы стандартной библиотеки, принятые для C ++ 17».
- ^ «N4280: не членский размер () и больше (Риккардо Марканджело)» (PDF).
- ^ "N4284: Непрерывные итераторы (Йенс Маурер)".
- ^ "Предложение библиотеки файловой системы (Беман Дауэс)".
- ^ «ТС параллелизма следует стандартизировать».
- ^ «Специальные математические функции для C ++ 17, v5» (PDF).
- ^ «N4659: Рабочий проект стандарта языка программирования C ++» (PDF). §23.7.
- ^ «Определение байтового типа» (PDF).
- ^ «N4659: Рабочий проект стандарта языка программирования C ++» (PDF). §23.15.8.
- ^ "Полное описание PMR (полиморфных ресурсов памяти) - Нико Йосуттис".
- ^ «Поддержка стандартов C ++ в GCC - Проект GNU - Фонд свободного программного обеспечения (FSF)». gcc.gnu.org.
- ^ "Clang - C ++ 17, C ++ 14, C ++ 11 и C ++ 98 Статус". clang.llvm.org.
- ^ corob-msft. «Соответствие языку Visual C ++». docs.microsoft.com.
- ^ «Объявление: MSVC соответствует стандарту C ++».
- ^ «Глава 1. Статус». gcc.gnu.org.
- ^ "Статус libc ++ C ++ 17". llvm.org.
- ^ «Объявление: MSVC соответствует стандарту C ++». devblogs.microsoft.com.