С++17
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Версии языка C++ |
---|
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 ]
Библиотека
[ редактировать ]- Большая часть «Основ библиотек TS I», в том числе: [ 29 ] [ 30 ]
std::string_view
, ссылка, не владеющая только для чтения, на последовательность символов или фрагмент строки. [ 31 ]std::optional
, для представления необязательных объектов , тип данных, который не всегда может быть возвращен данным алгоритмом с поддержкой невозврата.std::any
, для хранения отдельных значений любого типа
std::uncaught_exceptions
, в качестве заменыstd::uncaught_exception
в обработке исключений [ 32 ] [ 10 ]- Новые функции вставки
try_emplace
иinsert_or_assign
дляstd::map
иstd::unordered_map
ассоциативные структуры данных «ключ-значение» [ 33 ] [ 34 ] - Единый доступ к контейнерам :
std::size
,std::empty
иstd::data
[ 34 ] [ 35 ] - Определение «смежных итераторов » [ 34 ] [ 36 ]
- Библиотека файловой системы, основанная на
boost::filesystem
[ 37 ] - Параллельные версии STL алгоритмов [ 38 ]
- Дополнительные математические специальные функции , включая эллиптические интегралы и функции Бесселя. [ 39 ]
std::variant
, объединения тегированный контейнер [ 40 ]std::byte
, позволяющий char заменить для типов данных, предназначенных для моделирования байта данных как байта, а не символа [ 41 ]- Характеристики логического оператора:
std::conjunction
,std::disjunction
иstd::negation
[ 42 ] <memory_resource>
заголовок для ресурсов полиморфной памяти [ 43 ]
Удаленные функции
[ редактировать ]В этой версии 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 ]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Отчет редакции N4661 — Языки программирования — C++» . 21 марта 2017 г. Архивировано из оригинала 04 февраля 2020 г. Проверено 21 марта 2017 г.
- ^ «ISO/IEC DIS 14882: Языки программирования — C++» (PDF) . Архивировано из оригинала (PDF) 25 марта 2017 г.
- ^ Херб Саттер (6 сентября 2017 г.). «C++17 официально одобрен» . Архивировано из оригинала 29 января 2020 года . Проверено 12 сентября 2017 г.
- ^ «ИСО/МЭК 14882:2017» . Архивировано из оригинала 29 января 2013 г. Проверено 3 декабря 2017 г.
- ^ «N3928: Расширение static_assert, v2 (Уолтер Э. Браун)» (PDF) . Архивировано (PDF) из оригинала 11 августа 2015 г. Проверено 3 апреля 2015 г.
- ^ «N4051: Разрешить имя типа в параметре шаблона шаблона (Ричард Смит)» . Архивировано из оригинала 11 августа 2015 г. Проверено 3 апреля 2015 г.
- ^ «N3922: Новые правила автоматического вычета из списка инициализации с скобками (Джеймс Деннетт)» . Архивировано из оригинала 10 августа 2015 г. Проверено 28 ноября 2014 г.
- ^ Jump up to: а б с «Обновления моего отчета о поездке» . Архивировано из оригинала 19 марта 2015 г. Проверено 28 ноября 2014 г.
- ^ «N4230: Определение вложенного пространства имен (Роберт Кавулак, Эндрю Томазос)» . Архивировано из оригинала 03 августа 2015 г. Проверено 28 ноября 2014 г.
- ^ Jump up to: а б с д и «Новые документы по основному языку, принятые для C++17» . Архивировано из оригинала 27 апреля 2015 г. Проверено 15 ноября 2014 г.
- ^ «N4266: Атрибуты пространств имен и перечислителей (Ричард Смит)» . Архивировано из оригинала 06 марта 2016 г. Проверено 15 ноября 2014 г.
- ^ «N4640: Рабочий проект стандарта языка программирования C++» (PDF) . стр. 193–195. Архивировано (PDF) из оригинала 12 марта 2017 г. Проверено 9 марта 2017 г.
- ^ «N4267: Добавление символьных литералов u8 (Ричард Смит)» . Архивировано из оригинала 28 октября 2015 г. Проверено 15 ноября 2014 г.
- ^ Томас Кёппе. «Шестнадцатеричные плавающие литералы для C++» . Архивировано из оригинала 21 сентября 2022 г. Проверено 16 июля 2017 г.
- ^ «N4659: Рабочий проект стандарта языка программирования C++» (PDF) . §5.13.4. Архивировано (PDF) из оригинала 7 декабря 2017 г. Проверено 24 марта 2017 г.
- ^ Джеймс Тутон; Майк Спертус (23 июня 2016 г.). «Объявление нетиповых параметров шаблона с помощью auto» . Архивировано из оригинала 16 сентября 2017 г. Проверено 8 ноября 2020 г.
- ^ «N4268: Разрешить постоянную оценку для всех аргументов шаблона, не являющихся типами (Ричард Смит)» . Архивировано из оригинала 12 марта 2016 г. Проверено 15 ноября 2014 г.
- ^ «N4295: Складные выражения (Эндрю Саттон, Ричард Смит)» . Архивировано из оригинала 4 апреля 2015 г. Проверено 15 ноября 2014 г.
- ^ «N4659: Рабочий проект стандарта языка программирования C++» (PDF) . §9.4.1. Архивировано (PDF) из оригинала 7 декабря 2017 г. Проверено 24 марта 2017 г.
- ^ «N4659: Рабочий проект стандарта языка программирования C++» (PDF) . §11.5. Архивировано (PDF) из оригинала 7 декабря 2017 г. Проверено 24 марта 2017 г.
- ^ «Операторы выбора с инициализатором» . Архивировано из оригинала 6 октября 2017 г. Проверено 9 октября 2018 г.
- ^ «Динамическое выделение памяти для перевыровненных данных» . Архивировано из оригинала 8 сентября 2017 г. Проверено 13 марта 2017 г.
- ^ «Вывод аргументов шаблона класса» . Архивировано из оригинала 31 января 2019 г. Проверено 30 января 2019 г.
- ^ "CppCon 2018: Тимур Думлер "Вывод аргументов шаблона класса в C++17" " . Ютуб . Архивировано из оригинала 21 августа 2019 г. Проверено 30 января 2019 г.
- ^ «N4640: Рабочий проект стандарта языка программирования C++» (PDF) . стр. 431–433. Архивировано (PDF) из оригинала 12 марта 2017 г. Проверено 9 марта 2017 г.
- ^ «N4659: Рабочий проект стандарта языка программирования C++» (PDF) . §19.8. Архивировано (PDF) из оригинала 7 декабря 2017 г. Проверено 24 марта 2017 г.
- ^ «P0012R1: Сделать спецификации исключений частью системы типов версии 5» . Архивировано из оригинала 12 сентября 2017 г. Проверено 17 декабря 2018 г.
- ^ «P0018R3: Лямбда-захват *this по значению как [=,*this], версия 3» . Архивировано из оригинала 22 августа 2017 г. Проверено 21 июня 2021 г.
- ^ «Принять основы библиотеки V1 TS-компоненты для C++17 (R1)» . Архивировано из оригинала 5 апреля 2016 г. Проверено 23 марта 2016 г.
- ^ «Текущее состояние» . Архивировано из оригинала 8 сентября 2020 г.
- ^ «std::basic_string_view — cppreference.com» . ru.cppreference.com . Архивировано из оригинала 17 июня 2016 г. Проверено 23 июня 2016 г.
- ^ «N4259: Формулировка для std::uncaught_Exceptions (Херб Саттер)» (PDF) . Архивировано (PDF) из оригинала 29 ноября 2014 г. Проверено 15 ноября 2014 г.
- ^ «N4279: Улучшенный интерфейс вставки для карт уникальных ключей (Томас Кёппе)» . Архивировано из оригинала 27 апреля 2015 г. Проверено 15 ноября 2014 г.
- ^ Jump up to: а б с «Новые документы стандартной библиотеки, принятые для C++17» . Архивировано из оригинала 29 ноября 2014 г. Проверено 15 ноября 2014 г.
- ^ «N4280: размер, не являющийся членом (Риккардо Марканджело)» (PDF) . Архивировано (PDF) из оригинала 9 марта 2015 г. Проверено 15 ноября 2014 г.
- ^ «N4284: Непрерывные итераторы (Йенс Маурер)» . Архивировано из оригинала 29 ноября 2014 г. Проверено 15 ноября 2014 г.
- ^ «Предложение библиотеки файловой системы (Беман Дауэс)» . Архивировано из оригинала 20 июля 2016 г. Проверено 12 декабря 2015 г.
- ^ «ТС параллелизма следует стандартизировать» . Архивировано из оригинала 5 апреля 2016 г. Проверено 23 марта 2016 г.
- ^ «Математические специальные функции для C++17, v5» (PDF) . Архивировано (PDF) из оригинала 5 апреля 2016 г. Проверено 23 марта 2016 г.
- ^ «N4659: Рабочий проект стандарта языка программирования C++» (PDF) . §23.7. Архивировано (PDF) из оригинала 7 декабря 2017 г. Проверено 24 марта 2017 г.
- ^ «Определение типа байта» (PDF) . Архивировано (PDF) из оригинала 25 марта 2017 г. Проверено 25 марта 2017 г.
- ^ «N4659: Рабочий проект стандарта языка программирования C++» (PDF) . §23.15.8. Архивировано (PDF) из оригинала 7 декабря 2017 г. Проверено 24 марта 2017 г.
- ^ «Полное описание PMR (полиморфных ресурсов памяти) — Нико Джосуттис» . Архивировано из оригинала 28 августа 2021 г. Проверено 16 ноября 2020 г.
- ^ «N3981: Удаление триграфов??! (Ричард Смит)» . 06.05.2014. Архивировано из оригинала 9 июля 2018 г. Проверено 3 апреля 2015 г.
- ^ Комментарий IBM о подготовке к неблагоприятному для Trigraph будущему в C++17. Архивировано 11 сентября 2018 г. в Wayback Machine , документ IBM N4210, 10 октября 2014 г. Авторы: Майкл Вонг, Хьюберт Тонг, Раджан Бхакта, Дерек Инглис
- ^ «N4190: Удаление auto_ptr, random_shuffle() и старых <функциональных> вещей (Стефан Т. Лававей)» . Архивировано из оригинала 20 октября 2017 г. Проверено 28 ноября 2014 г.
- ^ «Ключевые слова C++: регистрация» . Архивировано из оригинала 3 сентября 2018 г. Проверено 3 сентября 2018 г.
- ^ «Поддержка стандартов C++ в GCC — Проект GNU — Фонд свободного программного обеспечения (FSF)» . gcc.gnu.org . Архивировано из оригинала 4 апреля 2018 г. Проверено 03 апреля 2018 г.
- ^ «Clang — статус C++17, C++14, C++11 и C++98» . clang.llvm.org . Архивировано из оригинала 4 июля 2013 г. Проверено 26 июня 2018 г.
- ^ corob-msft. «Соответствие языка Visual C++» . docs.microsoft.com . Архивировано из оригинала 19 июня 2018 г. Проверено 19 июня 2018 г.
- ^ «Объявление: MSVC соответствует стандарту C++» . 7 мая 2018 г. Архивировано из оригинала 26 августа 2018 г. Проверено 8 мая 2018 г.
- ^ «Глава 1. Статус» . gcc.gnu.org . Архивировано из оригинала 4 июня 2018 г. Проверено 19 июня 2018 г.
- ^ «Состояние libc++ C++17» . llvm.org . Архивировано из оригинала 24 мая 2019 г. Проверено 24 мая 2019 г.
- ^ «Объявление: MSVC соответствует стандарту C++» . devblogs.microsoft.com . 7 мая 2018 г. Архивировано из оригинала 26 августа 2018 г. Проверено 24 мая 2019 г.