Особенности языка:
Шаблоны и общий код
лямбда
Атрибуты
Синтаксическая очистка
Более чистый мульти-возврат и контроль потока
Структурированные привязки
- В основном, первоклассный
std::tie
сauto
- Пример:
const auto [it, inserted] = map.insert( {"foo", bar} );
- Создает переменные
it
и inserted
с выведенным типом из того, pair
что map::insert
возвращает.
- Работает с кортежем / парой лайков и
std::array
с относительно плоскими структурами
- Фактически названные структурированные привязки в стандарте
if (init; condition)
а также switch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
- Распространяется на
if(decl)
случаи, когда decl
не конвертируется в bool разумно.
Обобщение на основе диапазона для петель
- Похоже, что в основном это поддержка дозорных или конечных итераторов, которые не совпадают с типом начальных итераторов, что помогает с циклами с нулевым символом в конце и т.п.
если constexpr
- Очень запрошенная функция для упрощения почти универсального кода.
Разное
Шестнадцатеричные литералы с плавающей точкой
Динамическое распределение памяти для выровненных данных
Гарантированное копирование
- В заключение!
- Не во всех случаях, но отличает синтаксис, где вы «просто создаете что-то», называемое elision, от «подлинного elision».
Исправлен порядок оценки (некоторых) выражений с некоторыми изменениями
- Не включая аргументы функции, но перемежение оценки аргументов функции теперь запрещено
- Заставляет кучу сломанного кода работать в основном, и делает
.then
на будущей работе.
Прямая список-инициализация перечислений
Прямые гарантии прогресса (FPG) (также FPG для параллельных алгоритмов )
- Я думаю, что это говорит о том, что "реализация может не останавливать потоки навсегда"?
u8'U', u8'T', u8'F', u8'8'
символьные литералы (строка уже существует)
«noexcept» в системе типов
__has_include
- Проверьте, будет ли заголовочный файл включать в себя ошибку
- делает переход от экспериментального к стандартному стандарту практически без проблем
Массивы исправлений преобразования указателей
Унаследованные конструкторы исправляют некоторые угловые случаи ( примеры изменений поведения см. в P0136R0 )
агрегатная инициализация с наследованием .
std::launder
наберите пунктинг и т. д.
Библиотечные дополнения:
Типы данных
Вызывать вещи
std::invoke
- Вызывать любой вызываемый объект (указатель на функцию, функцию, указатель на член) с одним синтаксисом. Из стандартной концепции INVOKE.
std::apply
- Принимает функцию и кортеж и распаковывает кортеж в вызов.
std::make_from_tuple
, std::apply
Применяется к объекту строительства
is_invocable
, is_invocable_r
,invoke_result
Резьбонарезной
Улучшения контейнера
Умный указатель изменений
Другие std
улучшения типов данных:
Разное
Библиотека C ++ 17 основана на C11 вместо C99
Зарезервировано std[0-9]+
для будущих стандартных библиотек
destroy(_at|_n)
, uninitialized_move(_n)
, uninitialized_value_construct(_n)
,uninitialized_default_construct(_n)
- код утилиты уже в большинстве
std
реализаций выставлен
- Специальные математические функции
- ученым они могут понравиться
std::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
грубо
gcd
а также lcm
std::uncaught_exceptions
- Требуется, если вы хотите бросать только если в безопасности от деструкторов
std::as_const
std::bool_constant
- Целая куча
_v
шаблонных переменных
std::void_t<T>
- Удивительно полезно при написании шаблонов
std::owner_less<void>
- вроде бы
std::less<void>
, но для умных указателей сортировать по содержанию
std::chrono
польский
std::conjunction
, std::disjunction
,std::negation
Подвергаются
std::not_fn
- Правила для noexcept в
std
- std :: is_contiguous_layout , полезно для эффективного хеширования
- std :: to_chars / std :: from_chars , высокая производительность, независимое от локали преобразование чисел; наконец, способ сериализации / десериализации в удобочитаемые форматы (JSON & co)
std :: default_order , перенаправление окончено std::less
. ( нарушает ABI некоторых компиляторов из-за искажения имени, удалено.)
Черты
Устаревшее
Isocpp.org имеет независимый список изменений с C ++ 14; это было частично разграблено.
Естественно, работа TS продолжается параллельно, поэтому есть некоторые TS, которые еще не созрели и должны будут ждать следующей итерации. Целью следующей итерации является C ++ 20, как планировалось ранее, а не C ++ 19, как предполагают некоторые слухи. C ++ 1O удалось избежать.
Первоначальный список взят из этого поста reddit и этого поста reddit , со ссылками, добавленными через поиск в Google или с указанной выше страницы isocpp.org.
Дополнительные записи разграблены из списка функциональных испытаний SD-6 .
Список функций звона в и библиотеке список функций находятся рядом расхищаться. Это не кажется надежным, так как это C ++ 1z, а не C ++ 17.
у этих слайдов были некоторые особенности, отсутствующие в другом месте.
В то время как «что было удалено» не спрашивалось, вот краткий список нескольких вещей ((в основном?) Предыдущих устаревших), которые удалены в C ++ 17 из C ++:
Удалены:
Были переписки. Я не уверен, имеют ли они какое-либо влияние на код, или они просто очищают в стандарте:
Документы еще не включены в выше:
P0505R0 (constexpr chrono)
P0418R2 (атомные настройки)
P0512R0 ( настройка вывода аргумента шаблона)
P0490R0 (структурированные привязки настроек)
P0513R0 (изменяется на std::hash
)
P0502R0 (параллельные исключения)
P0509R1 (обновление ограничений на обработку исключений)
P0012R1 (сделать спецификации исключений частью системы типов)
P0510R0 (ограничения на варианты)
P0504R0 (теги для дополнительного / варианта / любого)
P0497R0 (общие настройки ptr)
P0508R0 (ручки узла структурированных привязок)
P0521R0 (общее использование указателя и уникальные изменения?)
Изменения спецификаций:
Дальнейшая ссылка: