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

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

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

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

1 ответ

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

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

лямбда

Атрибуты

Очистка синтаксиса

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

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

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

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

Многопоточность

  • std::shared_mutex

    • Необработанный, который может быть более эффективным, если он вам не нужен.
  • atomic<T>::is_always_lockfree

  • scoped_lock<Mutexes...>

    • Сохраняет некоторые std::lock боль при блокировке более чем одного мьютекса одновременно.
  • Параллелизм TS v1

    • Связанный документ с 2014 года, может быть устаревшим
    • Параллельные версии std алгоритмы и связанные с ними механизмы
  • аппаратное обеспечение _ * _ interference_size

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

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

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

  • unique_ptr<T[]> исправления и прочее unique_ptr твики.
  • weak_from_this и некоторые исправлены, чтобы поделиться с этим

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

Разное

Черты

Устаревшие

Isocpp.org имеет независимый список изменений, начиная с C++14; это было частично разграблено.

Естественно, работа TS продолжается параллельно, поэтому есть некоторые TS, которые еще не созрели и должны будут ждать следующей итерации. Целью следующей итерации является C++20, как планировалось ранее, а не C++19, как предполагают некоторые слухи. C++1O удалось избежать.

Первоначальный список взят из этого поста reddit и этого поста reddit, со ссылками, добавленными с помощью googling или с указанной выше страницы isocpp.org.

Дополнительные записи разграблены из списка функциональных испытаний SD-6.

Список возможностей clang и список функций библиотеки будут разграблены. Это не кажется надежным, так как это 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 (общее использование указателя и уникальные изменения?)

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

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

Другие вопросы по тегам