Каковы новые возможности в С++ 17?

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

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

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

Ответы

Ответ 1

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

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

Lambda

Атрибуты

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

Очистка нескольких возвратов и управления потоком

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

    • В принципе, первоклассный std::tie с auto
    • Пример:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Создает переменные it и inserted с выведенным типом из pair, который возвращает map::insert.
    • Работает с tuple/pair-likes и std::array и относительно плоскими структурами
    • Фактически названный структурированные привязки в стандартном
  • if (init; condition) и switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Расширяет if(decl) до случаев, когда decl не может быть конвертируемым в bool разумно.
  • Обобщающий диапазон для циклов

    • Появляется в основном поддержка часовых или конечных итераторов, которые не являются тем же типом, что и итераторы, которые помогают с циклами с нулевым концом и т.д.
  • if constexpr

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

Разное

Добавления в библиотеку:

Типы данных

  • std::variant<Ts...>

    • Почти всегда не пустое последнее, что я проверил?
    • Маркированный тип объединения
    • {устрашающий | полезно}
  • std::optional

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

    • Удерживает одно (что можно скопировать)
  • std::string_view

    • std::string как ссылочный символ или подстрока
    • Никогда не принимайте string const& снова. Кроме того, можно сделать разбор по баджллиону раз быстрее.
    • "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

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

Threading

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

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

Изменения интеллектуального указателя

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

Разное

Черты характера

Устаревшие

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

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

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

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

список функций clang и список функций библиотеки следующие быть разграбленным. Это не кажется надежным, так как это С++ 1z, а не С++ 17.

эти слайды имели некоторые функции, отсутствующие в других местах.

В то время как "то, что было удалено" не было задано, вот краткий список нескольких вещей ((главным образом?) предыдущих устаревших), которые удалены в С++ 17 из С++:

Удалено:

Были реплики. Я не уверен, что они оказывают какое-либо влияние на код, или если они просто очищаются в стандарте:

Документы, еще не интегрированные в выше:

  • P0505R0 (constexpr chrono)

  • P0418R2 (атомные твики)

  • P0512R0 (настройки вывода аргументов шаблона)

  • P0490R0 (структурированные привязки привязки)

  • P0513R0 (изменяется на std::hash)

  • P0502R0 (параллельные исключения)

  • P0509R1 (обновление ограничений на обработку исключений)

  • P0012R1 (сделать спецификации исключений частью системы типов)

  • P0510R0 (ограничения на варианты)

  • P0504R0 (теги для необязательного/варианта/любого)

  • P0497R0 (общие настройки ptr)

  • P0508R0 (структурированные привязки node)

  • P0521R0 (общий счет использования указателей и уникальные изменения?)

Спектр изменений:

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