Каковы новые функции в C ++ 17?

1007

C ++ 17 теперь полностью готов, поэтому вряд ли он претерпит большие изменения. Сотни предложений были выдвинуты для C ++ 17.

Какие из этих функций были добавлены в C ++ в C ++ 17?

При использовании компилятора C ++, который поддерживает «C ++ 1z», какие из этих функций будут доступны при обновлении компилятора до C ++ 17?

Якк - Адам Невраумонт
источник
26
Полный список возможностей по Clang: библиотека , основной язык .
Kerrek SB
3
этот блог Bost имеет хороший обзор: bfilipek.com/2017/01/cpp17features.html
ATB
13
См. Официальный документ Изменения между C ++ 14 и C ++ 17 DIS (P0636r0) для получения списка основных изменений с C ++ 14 до C ++ 17.
Jotik
1
@RaghavNavada Отлично! Поддерживается ли раздел C ++ 20? Есть # 53 , но он закрыт ...
LF
Все на этом сайте en.cppreference.com/w/cpp помечено необходимой версией.
19

Ответы:

1266

Особенности языка:

Шаблоны и общий код

лямбда

Атрибуты

Синтаксическая очистка

Более чистый мульти-возврат и контроль потока

  • Структурированные привязки

    • В основном, первоклассный 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

    • Очень запрошенная функция для упрощения почти универсального кода.

Разное

Библиотечные дополнения:

Типы данных

  • std::variant<Ts...>

    • Почти всегда непустое последнее, что я проверял?
    • Помеченный тип объединения
    • {Удивительным | полезным}
  • std::optional

    • Может быть, держит что-то
    • Смешно полезно
  • std::any

    • Содержит один из чего-либо (это копируется)
  • std::string_view

    • std::string как ссылка на символьный массив или подстроку
    • Никогда не принимай string const&снова. Также может сделать разбор bajillion раз быстрее.
    • "hello world"sv
    • constexpr char_traits
  • std::byte больше, чем они могли жевать.

    • Ни целое число, ни символ, просто данные

Вызывать вещи

  • std::invoke
    • Вызывать любой вызываемый объект (указатель на функцию, функцию, указатель на член) с одним синтаксисом. Из стандартной концепции INVOKE.
  • std::apply
    • Принимает функцию и кортеж и распаковывает кортеж в вызов.
  • std::make_from_tuple, std::applyПрименяется к объекту строительства

  • is_invocable, is_invocable_r,invoke_result

Файловая система TS v1

Новые алгоритмы

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • Добавлен для многопоточности, доступен, даже если вы не используете их с резьбой

Резьбонарезной

(части) Основы библиотеки TS v1, не охваченные выше или ниже

Улучшения контейнера

Умный указатель изменений

Другие stdулучшения типов данных:

Разное

Черты

Устаревшее

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 (общее использование указателя и уникальные изменения?)

Изменения спецификаций:

Дальнейшая ссылка:

Якк - Адам Невраумонт
источник
2
Хм, memory_order_consumeпохоже, официально не рекомендуется. Это просто не рекомендуется в записке. Может быть, имеет смысл упомянуть об этом (например, с завершающими скобками)?
LF