Каковы новые функции в C++17?
C++17 теперь полностью готов, поэтому вряд ли он претерпит большие изменения. Сотни предложений были выдвинуты для C++17.
Какие из этих функций были добавлены в C++ в C++17?
При использовании компилятора C++, который поддерживает "C++1z", какие из этих функций будут доступны при обновлении компилятора до C++17?
1 ответ
Особенности языка:
Шаблоны и общий код
Вывод аргумента шаблона для шаблонов классов
- Подобно тому, как функции выводят аргументы шаблона, теперь конструкторы могут выводить аргументы шаблона класса
- http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
template <auto>
- Представляет значение любого типа (аргумент шаблона не тип).
template<template<class...>typename bob> struct foo {}
auto x{8};
являетсяint
лямбда
- Лямбды неявно являются constexpr, если они имеют право
[*this]{ std::cout << could << " be " << useful << '\n'; }
Атрибуты
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
атрибутыusing
в атрибутах, чтобы избежать необходимости повторять пространство имен атрибута.Компиляторы теперь должны игнорировать нестандартные атрибуты, которые они не распознают.
- Формулировка C++14 позволяла компиляторам отклонять неизвестные атрибуты области.
Очистка синтаксиса
- Как встроенные функции
- Компилятор выбирает, где экземпляр создан
- Устаревать статическое переопределение constexpr, теперь неявно встроенное.
namespace A::B
просто
static_assert(expression);
без строкинет
throw
еслиthrow()
, а такжеthrow()
являетсяnoexcept(true)
,
Более чистый мульти-возврат и контроль потока
- В основном, первоклассный
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 разумно.
Обобщение на основе диапазона для петель
- Похоже, что в основном это поддержка дозорных или конечных итераторов, которые не относятся к типу начальных итераторов, что помогает с циклами с нулевым символом в конце и т.п.
- Очень запрошенная функция для упрощения почти универсального кода.
Разное
- В заключение!
- Не во всех случаях, но отличает синтаксис, когда вы "просто создаете что-то", называемое elision, от "подлинного elision".
Исправлен порядок оценки (некоторых) выражений с некоторыми изменениями
- Не включая аргументы функции, но перемежение оценки аргументов функции теперь запрещено
- Заставляет кучу сломанного кода работать в основном, и делает
.then
на будущую работу.
Прямые гарантии прогресса (FPG) (также FPG для параллельных алгоритмов)
- Я думаю, что это говорит о том, что "реализация может не останавливать потоки навсегда"?
u8'U', u8'T', u8'F', u8'8'
символьные литералы (строка уже существует)__has_include
- Проверьте, будет ли заголовочный файл включать в себя ошибку
- делает переход от экспериментального к стандартному стандарту практически без проблем
Унаследованные конструкторы исправляют некоторые угловые случаи (примеры изменений поведения см. в P0136R0)
std::launder
наберите пунктинг и т. д.
Библиотечные дополнения:
Типы данных
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
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0077r2.html
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0604r0.html
- принижает
result_of
is_invocable<Foo(Args...), R>
это "ты можешь позвонитьFoo
сArgs...
и получить что-то совместимое сR
", гдеR=void
по умолчанию.invoke_result<Foo, Args...>
являетсяstd::result_of_t<Foo(Args...)>
но видимо менее запутанным?
Файловая система TS v1
[class.path]
[class.filesystem.error]
[class.file_status]
[class.directory_entry]
[class.directory_iterator]
а также[class.recursive_directory_iterator]
[fs.ops.funcs]
fstream
с можно открыть с помощьюpath
с, а также сconst path::value_type*
строки.
Новые алгоритмы
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
боль при блокировке более чем одного мьютекса одновременно.
- Сохраняет некоторые
- Связанный документ с 2014 года, может быть устаревшим
- Параллельные версии
std
алгоритмы и связанные с ними механизмы
(части) Основы библиотеки TS v1, не охваченные выше или ниже
[func.searchers]
а также[alg.search]
- Алгоритм поиска и методы
[pmr]
- Полиморфный распределитель, как
std::function
для распределителей - И некоторые стандартные ресурсы памяти, чтобы пойти с ним.
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
- Полиморфный распределитель, как
std::sample
, выборка из диапазона?
Улучшения контейнера
try_emplace
а такжеinsert_or_assign
- дает лучшие гарантии в некоторых случаях, когда поддельное перемещение / копирование будет плохим
Сплайсинг для
map<>
,unordered_map<>
,set<>
, а такжеunordered_set<>
- Перемещение узлов между контейнерами дешево.
- Объедините целые контейнеры дешево.
неконстантная
.data()
для строки.нечлен
std::size
,std::empty
,std::data
- лайк
std::begin
/end
- лайк
constexpr
итераторыemplace
Семейство функций теперь возвращает ссылку на созданный объект.
Умный указатель изменений
unique_ptr<T[]>
исправления и прочееunique_ptr
твики.weak_from_this
и некоторые исправлены, чтобы поделиться с этим
Другой std
улучшения типа данных:
{}
возведениеstd::tuple
и другие улучшения- TriviallyCopyable reference_wrapper, может быть повышение производительности
Разное
Библиотека 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 некоторых компиляторов из-за искажения имени, удалено.)
Черты
Устаревшие
- Некоторые библиотеки C,
<codecvt>
memory_order_consume
result_of
, заменен наinvoke_result
shared_ptr::unique
это не очень потокобезопасно
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++:
Удалены:
register
ключевое слово зарезервировано для будущего использованияbool b; ++b;
- триграфы
- если они вам все еще нужны, они теперь являются частью вашей кодировки исходного файла, а не частью языка
- ios aliases
- auto_ptr, старый
<functional>
материал,random_shuffle
- распределители в
std::function
Были переписки. Я не уверен, имеют ли они какое-либо влияние на код, или они просто очищают в стандарте:
Документы еще не включены в выше:
P0505R0 (constexpr chrono)
P0418R2 (атомные настройки)
P0490R0 (структурированные привязки)
P0513R0 (изменяется на
std::hash
)P0502R0 (параллельные исключения)
P0509R1 (обновление ограничений на обработку исключений)
P0012R1 (сделать спецификации исключений частью системы типов)
P0510R0 (ограничения на варианты)
P0504R0 (теги для дополнительного / варианта / любого)
P0497R0 (общие настройки ptr)
P0508R0 (ручки узла структурированных привязок)
P0521R0 (общее использование указателя и уникальные изменения?)
Изменения спецификаций:
Дальнейшая ссылка:
https://isocpp.org/files/papers/p0636r0.html
- Должен быть обновлен до "Модификации существующих функций" здесь.