Namespaces
Variants

C++17

From cppreference.net

C++17 — это основная версия, следующая за минорной версией C++14 и представляющая новые возможности языка и библиотеки. Стандарт был опубликован в декабре 2017 года.

Следующие возможности были добавлены в C++17:

Содержание

Устаревшие возможности

Удаленные возможности
Устаревшие возможности

Новые возможности языка

Новые заголовки

Новые возможности библиотеки

Утилитарные типы

Управление памятью

Программирование на этапе компиляции

Алгоритмы

Итераторы и контейнеры

Числовые операции

Другие

Отчеты о дефектах

Отчёты об ошибках, исправленные в C++17 (290 ядро, 363 библиотека)

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

Основные возможности языка 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

Основные переводы: - `(untimed)` → `(без временных ограничений)` - `Feature-testing macro` → `Макрос тестирования возможностей` - `Yes` → `Да` - `N/A` → `Н/Д` Все HTML-теги, атрибуты и C++ специфические термины (такие как `std::shared_mutex`, `FTM`, `__cpp_lib_shared_mutex`) сохранены без изменений. Изменения: - "Yes" → "Да" - "N/A" → "Н/Д" Все HTML-теги, атрибуты и C++ специфические термины (std::sample, FTM, P0220R1, __cpp_lib_sample) сохранены без изменений. Изменения: - "Yes" → "Да" (в двух местах) - "N/A" → "Н/П" (Не применимо) - Все HTML теги, атрибуты и C++ специфические термины (std::is_invocable, std::invoke_result, FTM, P0604R0) сохранены без изменений
Функция 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