Jump to content

С++17

C++17 — это версия стандарта ISO / IEC 14882 для языка программирования C++ . C++17 заменил предыдущую версию стандарта C++, называемую C++14 , а позже был заменен C++20 .

До того, как Комитет по стандартам 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++17 появилось много новых возможностей. Следующие списки могут быть неполными.

  • Создание текстового сообщения для static_assert необязательный [ 5 ]
  • Позволять typename (как альтернатива class) в параметре шаблона шаблона [ 6 ]
  • Новые правила для auto вывод из списка braced-init [ 7 ] [ 8 ]
  • Определения вложенных пространств имен, например: namespace X::Y { } вместо namespace X { namespace Y { } }[ 8 ] [ 9 ]
  • Разрешение атрибутов для пространств имен и перечислителей [ 10 ] [ 11 ]
  • Новые стандартные атрибуты [[fallthrough]], [[maybe_unused]] и [[nodiscard]][ 12 ]
  • UTF-8 ( u8) символьные литералы [ 10 ] [ 13 ] (Строковые литералы UTF-8 существуют со времен C++11 ; C++17 добавляет соответствующие символьные литералы для согласованности, хотя, поскольку они ограничены одним байтом, они могут хранить только « Basic Latin » и управляющие коды C0 , т.е. ASCII )
  • Шестнадцатеричные с плавающей запятой литералы [ 14 ] [ 15 ]
  • Использование auto как тип для параметра шаблона, не являющегося типом [ 16 ]
  • Постоянная оценка для всех аргументов шаблона, не являющихся типами. [ 10 ] [ 17 ]
  • Выражения сгиба для шаблонов с переменным числом аргументов [ 10 ] [ 18 ]
  • Статический код времени компиляции if с формой if constexpr(expression)[ 19 ]
  • Структурированные объявления привязки, позволяющие auto [a, b] = getTwoReturnValues();[ 20 ]
  • Инициализаторы в if и switch заявления [ 21 ]
  • копирование-инициализация и прямая инициализация объектов типа T из выражений prvalue типа T (игнорируя cv-квалификаторы верхнего уровня) не должно приводить к копированию или перемещению конструкторов из выражения prvalue. Для получения дополнительной информации см. копирование elision .
  • Некоторые расширения по перераспределению памяти [ 22 ]
  • Вывод аргументов шаблона класса (CTAD), введение руководств по выводу конструктора, например позволяющее std::pair(5.0, false) вместо того, чтобы требовать явных типов аргументов конструктора std::pair<double, bool>(5.0, false) или дополнительная вспомогательная функция шаблона std::make_pair(5.0, false). [ 23 ] [ 24 ]
  • Встроенные переменные, что позволяет определять переменные в файлах заголовков, не нарушая правила одного определения . Правила фактически такие же, как и у встроенных функций.
  • __has_include, позволяющий проверять наличие заголовка с помощью директив препроцессора [ 25 ]
  • Стоимость __cplusplus изменен на 201703L[ 26 ]
  • Спецификации исключений стали частью типа функции. [ 27 ]
  • Лямбда-выражения могут захватывать «*this» по значению. [ 28 ]

Библиотека

[ редактировать ]

Удаленные функции

[ редактировать ]

В этой версии C++ не только добавлены новые возможности, но и удалены некоторые.

  • Триграфы были удалены. [ 44 ] [ 45 ]
  • были удалены некоторые устаревшие типы и функции Из стандартной библиотеки , в том числе std::auto_ptr, std::random_shuffleи старые функциональные адаптеры. [ 8 ] [ 46 ] В C++11 они были заменены улучшенными средствами, такими как std::unique_ptr, std::shuffle, std::bindи лямбды.
  • Использование ключевого слова (ранее нерекомендованное) register как спецификатор класса хранения был удален. [ 47 ] Это ключевое слово все еще зарезервировано , но сейчас не используется.

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

[ редактировать ]
  • GCC имеет полную поддержку функций языка C++17, начиная с версии 8. [ 48 ]
  • Clang 5 и более поздние версии поддерживают все функции языка C++17. [ 49 ]
  • Visual Studio 2017 15.8 (MSVC 19.15) и более поздних версий поддерживает все функции языка C++17. [ 50 ] [ 51 ]

Библиотечная поддержка

[ редактировать ]
  • libstdc++, начиная с версии 9.1, имеет полную поддержку C++17 (8.1 без Parallelism TS и ссылается на C99 вместо C11) [ 52 ]
  • libc++ начиная с версии 9 частично поддерживает C++17, а остальная часть находится в стадии разработки. [ 53 ]
  • Стандартная библиотека Visual Studio 2017 15.8 (MSVC 19.15) и более поздних версий поддерживает все функции библиотеки C++17, за исключением «Элементарных преобразований строк» ​​и ссылки на C99 вместо C11. «Элементарные преобразования строк» ​​добавлены в Visual Studio 2019 16.4. [ 54 ]

См. также

[ редактировать ]
  1. ^ «Отчет редакции N4661 — Языки программирования — C++» . 21 марта 2017 г. Архивировано из оригинала 04 февраля 2020 г. Проверено 21 марта 2017 г.
  2. ^ «ISO/IEC DIS 14882: Языки программирования — C++» (PDF) . Архивировано из оригинала (PDF) 25 марта 2017 г.
  3. ^ Херб Саттер (6 сентября 2017 г.). «C++17 официально одобрен» . Архивировано из оригинала 29 января 2020 года . Проверено 12 сентября 2017 г.
  4. ^ «ИСО/МЭК 14882:2017» . Архивировано из оригинала 29 января 2013 г. Проверено 3 декабря 2017 г.
  5. ^ «N3928: Расширение static_assert, v2 (Уолтер Э. Браун)» (PDF) . Архивировано (PDF) из оригинала 11 августа 2015 г. Проверено 3 апреля 2015 г.
  6. ^ «N4051: Разрешить имя типа в параметре шаблона шаблона (Ричард Смит)» . Архивировано из оригинала 11 августа 2015 г. Проверено 3 апреля 2015 г.
  7. ^ «N3922: Новые правила автоматического вычета из списка инициализации с скобками (Джеймс Деннетт)» . Архивировано из оригинала 10 августа 2015 г. Проверено 28 ноября 2014 г.
  8. ^ Jump up to: а б с «Обновления моего отчета о поездке» . Архивировано из оригинала 19 марта 2015 г. Проверено 28 ноября 2014 г.
  9. ^ «N4230: Определение вложенного пространства имен (Роберт Кавулак, Эндрю Томазос)» . Архивировано из оригинала 03 августа 2015 г. Проверено 28 ноября 2014 г.
  10. ^ Jump up to: а б с д и «Новые документы по основному языку, принятые для C++17» . Архивировано из оригинала 27 апреля 2015 г. Проверено 15 ноября 2014 г.
  11. ^ «N4266: Атрибуты пространств имен и перечислителей (Ричард Смит)» . Архивировано из оригинала 06 марта 2016 г. Проверено 15 ноября 2014 г.
  12. ^ «N4640: Рабочий проект стандарта языка программирования C++» (PDF) . стр. 193–195. Архивировано (PDF) из оригинала 12 марта 2017 г. Проверено 9 марта 2017 г.
  13. ^ «N4267: Добавление символьных литералов u8 (Ричард Смит)» . Архивировано из оригинала 28 октября 2015 г. Проверено 15 ноября 2014 г.
  14. ^ Томас Кёппе. «Шестнадцатеричные плавающие литералы для C++» . Архивировано из оригинала 21 сентября 2022 г. Проверено 16 июля 2017 г.
  15. ^ «N4659: Рабочий проект стандарта языка программирования C++» (PDF) . §5.13.4. Архивировано (PDF) из оригинала 7 декабря 2017 г. Проверено 24 марта 2017 г.
  16. ^ Джеймс Тутон; Майк Спертус (23 июня 2016 г.). «Объявление нетиповых параметров шаблона с помощью auto» . Архивировано из оригинала 16 сентября 2017 г. Проверено 8 ноября 2020 г.
  17. ^ «N4268: Разрешить постоянную оценку для всех аргументов шаблона, не являющихся типами (Ричард Смит)» . Архивировано из оригинала 12 марта 2016 г. Проверено 15 ноября 2014 г.
  18. ^ «N4295: Складные выражения (Эндрю Саттон, Ричард Смит)» . Архивировано из оригинала 4 апреля 2015 г. Проверено 15 ноября 2014 г.
  19. ^ «N4659: Рабочий проект стандарта языка программирования C++» (PDF) . §9.4.1. Архивировано (PDF) из оригинала 7 декабря 2017 г. Проверено 24 марта 2017 г.
  20. ^ «N4659: Рабочий проект стандарта языка программирования C++» (PDF) . §11.5. Архивировано (PDF) из оригинала 7 декабря 2017 г. Проверено 24 марта 2017 г.
  21. ^ «Операторы выбора с инициализатором» . Архивировано из оригинала 6 октября 2017 г. Проверено 9 октября 2018 г.
  22. ^ «Динамическое выделение памяти для перевыровненных данных» . Архивировано из оригинала 8 сентября 2017 г. Проверено 13 марта 2017 г.
  23. ^ «Вывод аргументов шаблона класса» . Архивировано из оригинала 31 января 2019 г. Проверено 30 января 2019 г.
  24. ^ "CppCon 2018: Тимур Думлер "Вывод аргументов шаблона класса в C++17" " . Ютуб . Архивировано из оригинала 21 августа 2019 г. Проверено 30 января 2019 г.
  25. ^ «N4640: Рабочий проект стандарта языка программирования C++» (PDF) . стр. 431–433. Архивировано (PDF) из оригинала 12 марта 2017 г. Проверено 9 марта 2017 г.
  26. ^ «N4659: Рабочий проект стандарта языка программирования C++» (PDF) . §19.8. Архивировано (PDF) из оригинала 7 декабря 2017 г. Проверено 24 марта 2017 г.
  27. ^ «P0012R1: Сделать спецификации исключений частью системы типов версии 5» . Архивировано из оригинала 12 сентября 2017 г. Проверено 17 декабря 2018 г.
  28. ^ «P0018R3: Лямбда-захват *this по значению как [=,*this], версия 3» . Архивировано из оригинала 22 августа 2017 г. Проверено 21 июня 2021 г.
  29. ^ «Принять основы библиотеки V1 TS-компоненты для C++17 (R1)» . Архивировано из оригинала 5 апреля 2016 г. Проверено 23 марта 2016 г.
  30. ^ «Текущее состояние» . Архивировано из оригинала 8 сентября 2020 г.
  31. ^ «std::basic_string_view — cppreference.com» . ru.cppreference.com . Архивировано из оригинала 17 июня 2016 г. Проверено 23 июня 2016 г.
  32. ^ «N4259: Формулировка для std::uncaught_Exceptions (Херб Саттер)» (PDF) . Архивировано (PDF) из оригинала 29 ноября 2014 г. Проверено 15 ноября 2014 г.
  33. ^ «N4279: Улучшенный интерфейс вставки для карт уникальных ключей (Томас Кёппе)» . Архивировано из оригинала 27 апреля 2015 г. Проверено 15 ноября 2014 г.
  34. ^ Jump up to: а б с «Новые документы стандартной библиотеки, принятые для C++17» . Архивировано из оригинала 29 ноября 2014 г. Проверено 15 ноября 2014 г.
  35. ^ «N4280: размер, не являющийся членом (Риккардо Марканджело)» (PDF) . Архивировано (PDF) из оригинала 9 марта 2015 г. Проверено 15 ноября 2014 г.
  36. ^ «N4284: Непрерывные итераторы (Йенс Маурер)» . Архивировано из оригинала 29 ноября 2014 г. Проверено 15 ноября 2014 г.
  37. ^ «Предложение библиотеки файловой системы (Беман Дауэс)» . Архивировано из оригинала 20 июля 2016 г. Проверено 12 декабря 2015 г.
  38. ^ «ТС параллелизма следует стандартизировать» . Архивировано из оригинала 5 апреля 2016 г. Проверено 23 марта 2016 г.
  39. ^ «Математические специальные функции для C++17, v5» (PDF) . Архивировано (PDF) из оригинала 5 апреля 2016 г. Проверено 23 марта 2016 г.
  40. ^ «N4659: Рабочий проект стандарта языка программирования C++» (PDF) . §23.7. Архивировано (PDF) из оригинала 7 декабря 2017 г. Проверено 24 марта 2017 г.
  41. ^ «Определение типа байта» (PDF) . Архивировано (PDF) из оригинала 25 марта 2017 г. Проверено 25 марта 2017 г.
  42. ^ «N4659: Рабочий проект стандарта языка программирования C++» (PDF) . §23.15.8. Архивировано (PDF) из оригинала 7 декабря 2017 г. Проверено 24 марта 2017 г.
  43. ^ «Полное описание PMR (полиморфных ресурсов памяти) — Нико Джосуттис» . Архивировано из оригинала 28 августа 2021 г. Проверено 16 ноября 2020 г.
  44. ^ «N3981: Удаление триграфов??! (Ричард Смит)» . 06.05.2014. Архивировано из оригинала 9 июля 2018 г. Проверено 3 апреля 2015 г.
  45. ^ Комментарий IBM о подготовке к неблагоприятному для Trigraph будущему в C++17. Архивировано 11 сентября 2018 г. в Wayback Machine , документ IBM N4210, 10 октября 2014 г. Авторы: Майкл Вонг, Хьюберт Тонг, Раджан Бхакта, Дерек Инглис
  46. ^ «N4190: Удаление auto_ptr, random_shuffle() и старых <функциональных> вещей (Стефан Т. Лававей)» . Архивировано из оригинала 20 октября 2017 г. Проверено 28 ноября 2014 г.
  47. ^ «Ключевые слова C++: регистрация» . Архивировано из оригинала 3 сентября 2018 г. Проверено 3 сентября 2018 г.
  48. ^ «Поддержка стандартов C++ в GCC — Проект GNU — Фонд свободного программного обеспечения (FSF)» . gcc.gnu.org . Архивировано из оригинала 4 апреля 2018 г. Проверено 03 апреля 2018 г.
  49. ^ «Clang — статус C++17, C++14, C++11 и C++98» . clang.llvm.org . Архивировано из оригинала 4 июля 2013 г. Проверено 26 июня 2018 г.
  50. ^ corob-msft. «Соответствие языка Visual C++» . docs.microsoft.com . Архивировано из оригинала 19 июня 2018 г. Проверено 19 июня 2018 г.
  51. ^ «Объявление: MSVC соответствует стандарту C++» . 7 мая 2018 г. Архивировано из оригинала 26 августа 2018 г. Проверено 8 мая 2018 г.
  52. ^ «Глава 1. Статус» . gcc.gnu.org . Архивировано из оригинала 4 июня 2018 г. Проверено 19 июня 2018 г.
  53. ^ «Состояние libc++ C++17» . llvm.org . Архивировано из оригинала 24 мая 2019 г. Проверено 24 мая 2019 г.
  54. ^ «Объявление: MSVC соответствует стандарту C++» . devblogs.microsoft.com . 7 мая 2018 г. Архивировано из оригинала 26 августа 2018 г. Проверено 24 мая 2019 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: fec9cf2894b7e670bb7a96f4f168bcf3__1708065120
URL1:https://arc.ask3.ru/arc/aa/fe/f3/fec9cf2894b7e670bb7a96f4f168bcf3.html
Заголовок, (Title) документа по адресу, URL1:
C++17 - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)