C++17
From cppreference.net
<
cpp
C++17 — это основная версия, следующая за минорной версией C++14 и представляющая новые возможности языка и библиотеки. Стандарт был опубликован в декабре 2017 года.
Следующие возможности были добавлены в C++17:
- Из File System TS : библиотека filesystem .
- Из Library fundamentals v1 TS : возможности, включая std::any , std::optional , std::string_view , std::apply , polymorphic allocators , searchers .
- Из Library fundamentals v2 TS : std::void_t , std::conjunction , std::disjunction , std::negation , std::not_fn , std::gcd , std::lcm .
-
Из
Parallelism v1 TS
: возможности, включая
execution policies
,
std::reduce
,
std::inclusive_scan
,
std::exclusive_scan
, но с удалением
exception_list. - Из Mathematical special functions IS : mathematical special functions .
- Из C11: std::aligned_alloc , std::timespec_get .
| Этот раздел не завершён |
Содержание |
Устаревшие возможности
Удаленные возможности
- std::auto_ptr ,
- устаревшие функциональные объекты ,
- std::random_shuffle ,
- std::unexpected ,
-
устаревшие
псевдонимы
iostream, - триграфы ,
- ключевое слово register ,
-
boolинкремент , - динамические спецификации исключений
Устаревшие возможности
- std::iterator ,
- std::raw_storage_iterator ,
- std::get_temporary_buffer ,
- std::is_literal_type ,
- std::result_of ,
- все элементы <codecvt>
Новые возможности языка
-
u8символьный литерал - добавлено noexcept в систему типов
- новые правила порядка вычислений
- захват в лямбде * this
-
constexpr
- вычисление во время компиляции if constexpr
- constexpr lambda
-
Переменные
- inline-переменные
- структурированные привязки
- инициализаторы для if и switch
- гарантированная элизия копирования
- материализация временных объектов
-
Шаблоны
- свертки-выражения ( ... )
- вывод аргументов шаблона класса tuple t ( 4 , 3 , 2.5 )
-
константные
параметры шаблона
объявленные с
auto
-
Пространства имён
- упрощённые вложенные пространства имён
-
using-объявление, объявляющее несколько имён - пространства имён атрибутов не требуют повторения
-
новые
атрибуты
:
-
[[ fallthrough ]] -
[[ maybe_unused ]] -
[[ nodiscard ]]
-
- __has_include
Новые заголовки
Новые возможности библиотеки
Утилитарные типы
Управление памятью
- алгоритмы для неинициализированной памяти
- weak_from_this
- std::pmr::memory_resource и std::polymorphic_allocator
- std::aligned_alloc
- прозрачный std::owner_less
- поддержка массивов для std::shared_ptr
- функции выделения памяти с явным выравниванием
Программирование на этапе компиляции
- std::byte
- std::conjunction / std::disjunction / std::negation
-
шаблоны переменных type trait
(
xxx _+v) - std::is_swappable
- std::is_invocable
- std::is_aggregate
- std::has_unique_object_representations
Алгоритмы
- std::clamp
- параллельные алгоритмы и политики выполнения
- std::inclusive_scan
- std::exclusive_scan
- std::gcd
- std::lcm
- std::reduce
Итераторы и контейнеры
- map/set extract и map/set merge
- map/unordered_map try_emplace и insert_or_assign
- непрерывные итераторы ( LegacyContiguousIterator )
- не-члены std::size / std::empty / std::data
Числовые операции
Другие
- интерфейс кеш-линии
- std::launder
- std::uncaught_exceptions
- std::to_chars / std::from_chars
- std::atomic<T>::is_always_lock_free
- std::scoped_lock
- std::timespec_get
- функции округления для std::chrono::duration и std::chrono::time_point
Отчеты о дефектах
Поддержка компиляторами
Основные возможности языка C++17
|
Функция C++17
|
Документ(ы)
|
GCC
|
Clang
|
MSVC
|
Apple Clang
|
EDG eccp
|
Intel C++
|
Nvidia HPC C++ (ex PGI)*
|
Nvidia nvcc
|
Cray
|
Embarcadero C++ Builder
|
IBM Open XL C++ for AIX
|
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DR11: Новые правила для auto при прямой списочной инициализации | N3922 | 5 | 3.8 | 19.0 (2015)* | Да | 4.10.1 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| typename в параметре шаблона-шаблона | N4051 | 5 | 3.5 | 19.0 (2015)* | Да | 4.10.1 | 17.0 | 17.7 | Да* | 11.0 | 10.3 | 17.1.0 | |
| Удаление trigraphs | N4086 | 5 | 3.5 | 16.0* | Да | 5.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | ||
| Вложенное пространство имён определение | N4230 | 6 | 3.6 | 19.0 (Update 3)* | Да | 4.12 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| static_assert без сообщения ( FTM ) * | N3928 | 6 | 2.5 | 19.10* | Да | 4.12 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Атрибуты для пространств имён и перечислений ( FTM ) * ( FTM ) * | N4266 |
4.9 (частично)*
6 |
3.6 | 19.0 (2015)* | Да | 4.11 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
u8
символьные литералы
|
N4267 | 6 | 3.6 | 19.0 (2015)* | Да | 4.11 | 17.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Разрешить константное вычисление для всех константных аргументов шаблона ( FTM ) * | N4268 | 6 | 3.6 | 19.12* | Да | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Унарные сверточные выражения и пустые наборы параметров | P0036R0 | 6 | 3.9 | 19.12* | Да | 4.14 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Удаление устаревшего использования register ключевого слова | P0001R1 | 7 | 3.8 | 19.11* | Да | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Удалить устаревший operator ++ ( bool ) | P0002R1 | 7 | 3.8 | 19.11* | Да | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Сделать спецификации исключений частью системы типов ( FTM ) * | P0012R1 | 7 | 4 | 19.12* | Да | 4.14 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| __has_include в препроцессорных условных выражениях | P0061R1 | 5 | Да | 19.11* | Да | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| DR11: Новая спецификация для наследования конструкторов ( DR1941 и др.) ( FTM ) * | P0136R1 | 7 | 3.9 | 19.14* * | Да | 6.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | ||
| Агрегатные классы с базовыми классами ( FTM ) * | P0017R1 | 7 | 3.9 | 19.14* | Да | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Сворачивающие выражения ( FTM ) * | N4295 | 6 | 3.6 | 19.12* | Да | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Захват в лямбда-выражениях * this ( FTM ) * | P0018R3 | 7 | 3.9 | 19.11* | Да | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Прямая списочная инициализация перечислений | P0138R2 | 7 | 3.9 | 19.11* | Да | 4.14 | 18.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
constexpr
лямбда-выражения
(
FTM
)
*
|
P0170R1 | 7 | 5 | 19.11* | Да | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Различные типы begin и end в range-based for ( FTM ) * | P0184R0 | 6 | 3.9 | 19.10* | Да | 4.12 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
[[
fallthrough
]]
атрибут
|
P0188R1 | 7 | 3.9 | 19.10* | Да | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
[[
nodiscard
]]
атрибут
|
P0189R1 | 7 | 3.9 | 19.11* | Да | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
[[
maybe_unused
]]
атрибут
|
P0212R1 | 7 | 3.9 | 19.11* | Да | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Шестнадцатеричные литералы с плавающей точкой ( FTM ) * | P0245R1 | 3.0 | Да | 19.11* | Да | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Использование пространств имён атрибутов без повторения | P0028R4 | 7 | 3.9 | 19.11* | Да | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Динамическое выделение памяти для сверхвыровненных данных ( FTM ) * | P0035R4 | 7 | 4 | 19.12* | 10.0.0* | 4.14 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Константные параметры шаблона с типом auto ( FTM ) * | P0127R2 | 7 | 4 | 19.14* | Да | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Гарантированная copy elision ( FTM ) * | P0135R1 | 7 | 4 | 19.13* | Да | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Замена объектов классов, содержащих ссылочные члены | P0137R1 | 7 | 6 | 19.14* | Да | 5.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | ||
| Более строгий порядок вычисления выражений | P0145R3 | 7 | 4 | 19.14* | Да | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Структурированные привязки ( FTM ) * | P0217R3 | 7 | 4 | 19.11* | Да | 4.14 | 19.0 | 18.1 | 11.0* | 11.0 | 10.3 | 17.1.0 | |
| Игнорировать неизвестные атрибуты | P0283R2 | Да | 3.9 | 19.0 (2015)* | Да | 4.13 | 18.0 | 17.7 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| constexpr if операторы ( FTM ) * | P0292R2 | 7 | 3.9 | 19.11* | Да | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Инициализирующие выражения для if и switch | P0305R1 | 7 | 3.9 | 19.11* | Да | 4.14 | 18.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Встроенные переменные ( FTM ) * | P0386R2 | 7 | 3.9 | 19.12* | Да | 4.14 | 19.0 | 18.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Удаление dynamic exception specifications | P0003R5 | 7 | 4 | 19.12* | Да | 4.14 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Развертывание пакетов в using-объявлениях ( FTM ) * | P0195R2 | 7 | 4 | 19.14* | Да | 5.0 | 19.0 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| DR98: Сопоставление шаблонных аргументов-шаблонов исключает совместимые шаблоны ( FTM ) * | P0522R0 | 7 | 4 | 19.12* | Да | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Вывод аргументов шаблона класса ( FTM ) * | P0091R3 | 7 | 5 | 19.14* | Да | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
|
Функциональность C++17 |
Документ(ы) |
GCC
|
Clang
|
MSVC
|
Apple Clang
|
EDG eccp
|
Intel C++
|
Nvidia HPC C++ (ex PGI)*
|
Nvidia nvcc
|
Cray
|
Embarcadero C++ Builder
|
IBM Open XL C++ for AIX
|
Функции библиотеки C++17
|
Функция C++17
|
Документ(ы)
|
GCC libstdc++
|
Clang libc++
|
MSVC STL
|
Apple Clang*
|
IBM Open XL C/C++ for AIX*
|
Intel Parallel STL
|
Embarcadero C++ Builder*
|
|
|---|---|---|---|---|---|---|---|---|---|
| std::void_t ( FTM ) * | N3911 | 6.1 | 3.6 | 19.0 (2015)* | Да | 17.1.0 | Н/Д | 10.3 | |
| std::uncaught_exceptions() ( FTM ) * | N4259 | 6.1 | 3.7 | 19.0 (2015)* | Да | 17.1.0 | Н/Д | 10.3 | |
| std::size() , std::empty() и std::data() ( FTM ) * | N4280 | 6 | 3.6 | 19.0 (2015)* | Да | 17.1.0 | N/A | 10.3 | |
| std::allocator_traits::is_always_equal , noexcept очистки ( FTM ) * | N4258 | 6.1 | 3.7 | 19.0 (2015)* | 17.1.0 | N/A | |||
| std::invoke ( FTM ) * | N4169 | 6.1 | 3.7 | 19.0 (2015)* | Да | 17.1.0 | Н/Д | ||
| std::map::try_emplace , std::map::insert_or_assign ( FTM ) * | N4279 | 6.1 | 3.7 | 19.0 (2015)* | Да | 17.1.0 | Н/Д | ||
| std::unordered_map::try_emplace , std::unordered_map::insert_or_assign ( FTM ) * | N4279 | 6.1 | 3.7 | 19.0 (2015)* | Да | 17.1.0 | Н/Д | ||
| Улучшение std::pair и std::tuple | N4387 | 6.1 | 4 | 19.0 (Update 2)* | Да | 17.1.0 | Н/Д | 10.3 | |
| std::bool_constant ( FTM ) * | N4389 | 6.1 | 3.7 | 19.0 (2015)* | Да | 17.1.0 | Н/Д | 10.3 | |
| std::shared_mutex (без временных ограничений) ( FTM ) * | N4508 | 6 | 3.7 | 19.0 (Update 2)* | Да | 17.1.0 | Н/Д | 10.3 | |
| Минимальная поддержка неполных типов для std::forward_list , std::list и std::vector ( FTM ) * | N4510 | 3.0 | 3.6 | 18.0* | Да | 17.1.0 | N/A | ||
| Шаблоны переменных type traits ( FTM ) * | P0006R0 | 7.1 | 3.8 | 19.0 (Update 2)* | Да | 17.1.0 | Н/Д | 10.3 | |
| Логические операторы для типовых характеристик ( FTM ) * | P0013R1 | 6.1 | 3.8 | 19.0 (Update 2)* | Да | 17.1.0 | Н/Д | 10.3 | |
| std::as_const ( FTM ) * | P0007R1 | 7.1 | 3.8 | 19.0 (Update 2)* | Да | 17.1.0 | Н/Д | ||
| Функции округления для std::chrono::duration и std::chrono::time_point ( FTM ) * | P0092R1 | 7.1 | 3.8 | 19.0 (Update 2)* | Да | 17.1.0 | Н/Д | ||
| Прозрачный std::owner_less ( std::owner_less<void> ) ( FTM ) * | P0074R0 | 7.1 | 3.8 | 19.0 (Update 2)* | Да | 17.1.0 | Н/П | ||
| std::not_fn ( FTM ) * |
P0005R4
P0358R1 |
7.1 | 3.9 | 19.12* | Да | 17.1.0 | N/A | 10.3 | |
| Параллельные алгоритмы и политики выполнения ( FTM ) * ( FTM ) * | P0024R2 | 9* |
17
(частично)* |
19.14* | 18.0* | ||||
| std::clamp() ( FTM ) * | P0025R1 | 7 | 3.9 | 19.0 (Update 3)* | 10.0.0* | 17.1.0 | N/A | 10.3 | |
| (nothrow-)swappable traits ( FTM ) * | P0185R1 | 7.1* | 3.9 | 19.0 (Update 3)* | 10.0.0* | 17.1.0 | N/A | 10.3 | |
| Полиморфные ресурсы памяти ( FTM ) * | P0220R1 | 9.1 | 16 | 19.13* | 15.0.0* | 17.1.1 | N/A | 10.3 | |
| std::apply ( FTM ) * | P0220R1 | 7.1 | 16 | 19.13* | Да | 17.1.0 | Н/Д | ||
| Поисковые механизмы ( FTM ) * | P0220R1 | 7.1 | 16 | 19.13* | Да | 17.1.0 | Н/Д | ||
| std::sample ( FTM ) * | P0220R1 | 7.1 | 16 | 19.13* | Да | 17.1.0 | Н/Д | ||
| Математические специальные функции ( FTM ) * | P0226R1 | 7 | 19.14* | 17.1.1 | N/A | 10.3 | |||
| constexpr std::addressof ( FTM ) * | LWG2296 | 7.1 | Да | 19.0 (Update 3)* | 17.1.0 | Н/Д | |||
| constexpr для std::reverse_iterator , std::move_iterator , std::array и доступа к диапазонам ( FTM ) * | P0031R0 | 7.1 | 4 | 19.11* | Да | 17.1.0 | Н/Д | ||
| constexpr std:: atomic < T > :: is_always_lock_free ( FTM ) * | P0152R1 | 7.1 | 3.9 | 19.11* | Да | 17.1.0 | Н/Д | ||
| std::enable_shared_from_this::weak_from_this ( FTM ) * | P0033R1 | 7.1 | 3.9 | 19.12* | Да | 17.1.0 | Н/Д | ||
| 3-аргументная перегрузка std::hypot ( FTM ) * | P0030R1 | 7.1 | 3.9 | 19.14* | Да | 17.1.0 | Н/Д | ||
| std::byte ( FTM ) * | P0298R3 | 7 | 5 | 19.11* | Да | 17.1.1 | Н/Д | 10.3 | |
| std::string_view ( FTM ) * |
N3921
P0220R1 P0254R2 P0403R1 |
7.1 | 4 |
19.10*
(частично)*
19.11* * |
10.0.0* | 17.1.0 | Н/Д | 10.3 | |
| std::any ( FTM ) * |
P0220R1
P0032R3 |
7.1 | 4 | 19.10* | 10.0.0* | 17.1.0 | N/A | 10.3 | |
| std::optional ( FTM ) * | P0220R1 | 7.1 | 4 | 19.10* | 10.0.0* | 17.1.0 | N/A | 10.3 | |
| Основная часть стандартной библиотеки C11 | P0063R3 | 9.1 | 7 |
19.0 (2015)*
(частично)* |
10.0.0* | 17.1.1 | N/A | ||
| Слияние узлов Maps и Sets ( FTM ) * | P0083R3 | 7 | 8 | 19.12* | 10.0.0* | 17.1.1 | N/A | ||
| тип возвращаемого значения emplace * функций некоторых контейнеров изменён с void на ссылку | P0084R2 | 7.1 | 4.0 | 19.11* | Yes | 17.1.0 | N/A | ||
| std::variant ( FTM ) * | P0088R3 | 7.1 | 4 | 19.10* | 10.0.0* | 17.1.0 | N/A | 10.3 | |
| std::make_from_tuple() ( FTM ) * | P0209R2 | 7.1 | 3.9 | 19.10* | Да | 17.1.0 | Н/Д | 10.3 | |
| std::has_unique_object_representations ( FTM ) * | P0258R2 | 7.1 | 6 | 19.11* | Да | 17.1.1 | Н/Д | 10.3 | |
| std::gcd() и std::lcm() ( FTM ) * | P0295R0 | 7 | 4 | 19.11* | Да | 17.1.0 | N/A | 10.3 | |
| Проблема CWG 1776 : Замена объектов класса, содержащих ссылочные члены ( std::launder ) ( FTM ) * | P0137R1 | 7.1 | 6 | 19.14* | Да | 17.1.0 | Н/П | ||
| Расширение инструментов управления памятью ( FTM ) * | P0040R3 | 7.1 | 4 | 19.11* | 17.1.0 | N/A | |||
| shared_ptr::weak_type ( FTM ) * | P0163R0 | 7.1 | 3.9 | 19.10* | Да | 17.1.0 | Н/Д | ||
| Элементарные преобразования строк : std:: to_chars / std:: from_chars ( FTM ) * | P0067R5 |
8*
11 |
7*
14* 20* |
19.14*
*
19.24* |
10.0.0* * | 17.1.1* | Н/Д | 10.3* | |
| std::shared_ptr и std::weak_ptr с поддержкой массивов | P0414R2 | 7 | 11 | 19.12* | 12.0.0* | 17.1.1 | N/A | 10.3 | |
| Constexpr для всех функций-членов std::chrono::duration и std::chrono::time_point ( FTM ) * | P0505R0 | 7.1 | 4 | 19.11* | Да | 17.1.1 | Н/П | ||
| std:: shared_ptr < T [ ] > ( FTM ) * | P0497R0 | 7.1 | 11 | 19.12* | 17.1.1 | N/A | |||
| constexpr std::char_traits ( FTM ) * | P0426R1 | 8.1 | 4 | 19.14* | Да | 17.1.1 | Н/Д | ||
| Библиотека файловой системы ( std::filesystem ) ( FTM ) * |
P0218R1
P0219R1 |
8 | 7 | 19.14* | 11.0.0* | 17.1.1 | N/A | 10.3 | |
| Размер аппаратной интерференции ( FTM ) * | P0154R1 | 12.1 |
15 (частично)*
19 |
19.11* | N/A | 10.3 | |||
| std::scoped_lock ( FTM ) * | P0156R2 | 7 | 5 | 19.11* | Да | 17.1.1 | Н/Д | 10.3 | |
| std::is_aggregate ( FTM ) * | LWG2911 | 7 | 5 | 19.15* | Да | 17.1.1 | Н/Д | 10.3 | |
| std::is_invocable , std::invoke_result ( FTM ) * | P0604R0 | 7.1 | Да | 19.11* | Да | 17.1.1 | Н/П | ||
| DR17: std::hash<std::filesystem::path> | LWG3657 | 11.4 | 17 | 19.32* | Н/Д | ||||
|
Функция C++17 |
Документ(ы) |
GCC libstdc++
|
Clang libc++
|
MSVC STL
|
Apple Clang*
|
IBM Open XL C/C++ for AIX*
|
Intel Parallel STL
|
Embarcadero C++ Builder*
|
Примечания
- По состоянию на 20 ноября 2020 года, последний выпуск Oracle Developer Studio это версия 12.6 . Его документация не упоминает C++17.
- Компилятор Cray может иметь поддержку некоторых функций ранее версии 11.0. Эта версия стала производной от Clang, получив всю сопутствующую поддержку языковых функций базового компилятора. См. документ Cray/HPE S-2179 .
*
- наведите курсор на ячейку, отмеченную звездочкой
*
, чтобы увидеть дополнительные всплывающие примечания.
DR
nn
- число
nn
после "DR" обозначает целевую ревизию C++, к которой применяется Отчет о Дефектах, например, DR20 → C++20.
Внешние ссылки
| 1. | C++17 - Википедия |
| 2. | Рабочие примеры C++17 |