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

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

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

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

+895

Решение

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

лямбда

Атрибуты

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

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

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

    • В основном, первоклассный 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 удалось избежать.

Первоначальный список взят из этот реддит пост а также этот реддит пост, со ссылками, добавленными через поиск в Google или со страницы выше 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 (общее использование указателя и уникальные изменения?)

1142

Другие решения

Других решений пока нет …