C ++ 17 - C++17

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]

Библиотека

Поддержка компилятора

  • 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]

Смотрите также

Рекомендации

  1. ^ "Отчет редакции N4661 - Языки программирования - C ++". 21 марта 2017 г.. Получено 2017-03-21.
  2. ^ «ISO / IEC DIS 14882: Языки программирования - C ++» (PDF). Архивировано из оригинал (PDF) на 2017-03-25.
  3. ^ Херб Саттер. «C ++ 17 официально одобрен».
  4. ^ «ISO / IEC 14882: 2017».
  5. ^ «N3981: Удаление триграфов ??! (Ричард Смит)». 2014-05-06.
  6. ^ Комментарий IBM о подготовке к будущему, неблагоприятному для Trigraph, в C ++ 17, IBM paper N4210, 2014-10-10. Авторы: Майкл Вонг, Хуберт Тонг, Раджан Бхакта, Дерек Инглис
  7. ^ а б c «Обновления в отчете о моей поездке».
  8. ^ «N4190: Удаление auto_ptr, random_shuffle () и старых <функциональных> вещей (Стефан Т. Лававей)».
  9. ^ "Ключевые слова C ++: регистр".
  10. ^ "N3928: Расширение static_assert, v2 (Уолтер Э. Браун)" (PDF).
  11. ^ «N4051: Разрешить typename в параметре шаблона шаблона (Ричард Смит)».
  12. ^ «N3922: Новые правила автоматического вывода из списка инициализации в фигурных скобках (Джеймс Деннет)».
  13. ^ «N4230: определение вложенного пространства имен (Роберт Кавулак, Эндрю Томазос)».
  14. ^ а б c d е «Новые документы по основному языку, принятые для C ++ 17».
  15. ^ «N4266: Атрибуты для пространств имен и счетчиков (Ричард Смит)».
  16. ^ «N4640: Рабочий проект стандарта языка программирования C ++» (PDF). С. 193–195.
  17. ^ «N4267: Добавление символьных литералов u8 (Ричард Смит)».
  18. ^ Томас Кёппе. «Шестнадцатеричные плавающие литералы для C ++».
  19. ^ «N4659: Рабочий проект стандарта языка программирования C ++» (PDF). §5.13.4.
  20. ^ Джеймс Тутон; Майк Спертус (2016-06-23). "Объявление не типовых параметров шаблона с помощью auto".
  21. ^ «N4268: разрешить постоянную оценку для всех аргументов шаблона, не относящихся к типу (Ричард Смит)».
  22. ^ «N4295: Складные выражения (Эндрю Саттон, Ричард Смит)».
  23. ^ «N4659: Рабочий проект стандарта языка программирования C ++» (PDF). §9.4.1.
  24. ^ «N4659: Рабочий проект стандарта языка программирования C ++» (PDF). §11.5.
  25. ^ «Операторы выбора с инициализатором».
  26. ^ «Динамическое выделение памяти для выровненных данных».
  27. ^ "Вывод аргумента шаблона класса".
  28. ^ «CppCon 2018: Тимур Думлер» Вывод аргументов шаблона класса в C ++ 17"".
  29. ^ «N4640: Рабочий проект стандарта языка программирования C ++» (PDF). С. 431–433.
  30. ^ «N4659: Рабочий проект стандарта языка программирования C ++» (PDF). §19.8.
  31. ^ "P0012R1: Сделайте спецификации исключений частью системы типов, версия 5".
  32. ^ "Принять компоненты TS V1" Основы библиотеки "для C ++ 17 (R1)".
  33. ^ "Текущее состояние".
  34. ^ "std :: basic_string_view - cppreference.com". en.cppreference.com. Получено 2016-06-23.
  35. ^ "N4259: Формулировка для std :: uncaught_exceptions (Herb Sutter)" (PDF).
  36. ^ «N4279: Улучшенный интерфейс вставки карт уникальных ключей (Томас Кёппе)».
  37. ^ а б c «Новые документы стандартной библиотеки, принятые для C ++ 17».
  38. ^ «N4280: не членский размер () и больше (Риккардо Марканджело)» (PDF).
  39. ^ "N4284: Непрерывные итераторы (Йенс Маурер)".
  40. ^ "Предложение библиотеки файловой системы (Беман Дауэс)".
  41. ^ «ТС параллелизма следует стандартизировать».
  42. ^ «Специальные математические функции для C ++ 17, v5» (PDF).
  43. ^ «N4659: Рабочий проект стандарта языка программирования C ++» (PDF). §23.7.
  44. ^ «Определение байтового типа» (PDF).
  45. ^ «N4659: Рабочий проект стандарта языка программирования C ++» (PDF). §23.15.8.
  46. ^ "Полное описание PMR (полиморфных ресурсов памяти) - Нико Йосуттис".
  47. ^ «Поддержка стандартов C ++ в GCC - Проект GNU - Фонд свободного программного обеспечения (FSF)». gcc.gnu.org.
  48. ^ "Clang - C ++ 17, C ++ 14, C ++ 11 и C ++ 98 Статус". clang.llvm.org.
  49. ^ corob-msft. «Соответствие языку Visual C ++». docs.microsoft.com.
  50. ^ «Объявление: MSVC соответствует стандарту C ++».
  51. ^ «Глава 1. Статус». gcc.gnu.org.
  52. ^ "Статус libc ++ C ++ 17". llvm.org.
  53. ^ «Объявление: MSVC соответствует стандарту C ++». devblogs.microsoft.com.