C ++ 17 теперь полностью готов, поэтому вряд ли он претерпит большие изменения. Сотни предложений были выдвинуты для C ++ 17.
Какие из этих функций были добавлены в C ++ в C ++ 17?
При использовании компилятора C ++, который поддерживает «C ++ 1z», какие из этих функций будут доступны при обновлении компилятора до C ++ 17?
Ответы:
Особенности языка:
Шаблоны и общий код
Вывод аргумента шаблона для шаблонов классов
template <auto>
Исправлены не типовые аргументы шаблона
template<template<class...>typename bob> struct foo {}
(Складывание + ... + выражения) и редакции
auto x{8};
являетсяint
модернизация
using
с...
и спискилямбда
constexpr lambdas
Захват
*this
в лямбдах[*this]{ std::cout << could << " be " << useful << '\n'; }
Атрибуты
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
Атрибуты[[attributes]]
наnamespace
с иenum { erator[[s]] }
using
в атрибутах, чтобы избежать необходимости повторять пространство имен атрибута.Компиляторы теперь должны игнорировать нестандартные атрибуты, которые они не распознают .
Синтаксическая очистка
Встроенные переменные
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 разумно.Обобщение на основе диапазона для петель
если constexpr
Разное
Шестнадцатеричные литералы с плавающей точкой
Динамическое распределение памяти для выровненных данных
Гарантированное копирование
Исправлен порядок оценки (некоторых) выражений с некоторыми изменениями
.then
на будущей работе.Прямая список-инициализация перечислений
Прямые гарантии прогресса (FPG) (также FPG для параллельных алгоритмов )
u8'U', u8'T', u8'F', u8'8'
символьные литералы (строка уже существует)«noexcept» в системе типов
__has_include
Массивы исправлений преобразования указателей
Унаследованные конструкторы исправляют некоторые угловые случаи ( примеры изменений поведения см. в P0136R0 )
агрегатная инициализация с наследованием .
std::launder
наберите пунктинг и т. д.Библиотечные дополнения:
Типы данных
std::variant<Ts...>
std::optional
std::any
std::string_view
std::string
как ссылка на символьный массив или подстрокуstring const&
снова. Также может сделать разбор bajillion раз быстрее."hello world"sv
char_traits
std::byte
больше, чем они могли жевать.Вызывать вещи
std::invoke
std::apply
std::make_from_tuple
,std::apply
Применяется к объекту строительстваis_invocable
,is_invocable_r
,invoke_result
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
s можно открыть с помощьюpath
s, а также с помощью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
боль при блокировке более одного мьютекса за раз.Параллелизм TS v1
std
алгоритмов и связанных с ними машинаппаратное обеспечение _ * _ interference_size
(части) Основы библиотеки TS v1, не охваченные выше или ниже
[func.searchers]
а также[alg.search]
[pmr]
std::function
для распределителей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
и другие улучшенияРазное
Библиотека 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
std
std :: default_order , перенаправление окончено( нарушает ABI некоторых компиляторов из-за искажения имени, удалено.)std::less
.Черты
Устаревшее
<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 , со ссылками, добавленными через поиск в Google или с указанной выше страницы isocpp.org.
Дополнительные записи разграблены из списка функциональных испытаний SD-6 .
Список функций звона в и библиотеке список функций находятся рядом расхищаться. Это не кажется надежным, так как это C ++ 1z, а не C ++ 17.
у этих слайдов были некоторые особенности, отсутствующие в другом месте.
В то время как «что было удалено» не спрашивалось, вот краткий список нескольких вещей ((в основном?) Предыдущих устаревших), которые удалены в C ++ 17 из C ++:
Удалены:
register
ключевое слово зарезервировано для будущего использованияbool b; ++b;
<functional>
вещи,random_shuffle
std::function
Были переписки. Я не уверен, имеют ли они какое-либо влияние на код, или они просто очищают в стандарте:
Документы еще не включены в выше:
P0505R0 (constexpr chrono)
P0418R2 (атомные настройки)
P0512R0 ( настройка вывода аргумента шаблона)
P0490R0 (структурированные привязки настроек)
P0513R0 (изменяется на
std::hash
)P0502R0 (параллельные исключения)
P0509R1 (обновление ограничений на обработку исключений)
P0012R1 (сделать спецификации исключений частью системы типов)
P0510R0 (ограничения на варианты)
P0504R0 (теги для дополнительного / варианта / любого)
P0497R0 (общие настройки ptr)
P0508R0 (ручки узла структурированных привязок)
P0521R0 (общее использование указателя и уникальные изменения?)
Изменения спецификаций:
Дальнейшая ссылка:
документы сгруппированы по годам; не все приняты
https://isocpp.org/files/papers/p0636r0.html
источник
memory_order_consume
похоже, официально не рекомендуется. Это просто не рекомендуется в записке. Может быть, имеет смысл упомянуть об этом (например, с завершающими скобками)?