С++ 17 теперь полностью завершена, поэтому вряд ли произойдут большие изменения. Сотни предложений были выдвинуты для С++ 17.
Какая из этих функций была добавлена в С++ в С++ 17?
При использовании компилятора С++, который поддерживает "С++ 1z", какая из этих функций будет доступна, когда компилятор обновится до С++ 17?
Вывод аргумента шаблона для шаблонов классов
[*this]{ std::cout << could << " be " << useful << '\n'; }
[[fallthrough]]
, [[nodiscard]]
, [[maybe_unused]]
атрибуты
using
в атрибутах, чтобы избежать повторения пространства имен атрибутов.
Теперь компиляторы должны игнорировать нестандартные атрибуты, которые они не распознают.
Простой static_assert(expression);
без строки
no 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 разумно.Обобщающий диапазон для циклов
Динамическое распределение памяти для перенастроенных данных
Гарантированное копирование текста
Исправлен порядок оценки для (некоторых) выражений с некоторыми модификации
.then
для будущей работы.Перспективные гарантии прогресса (FPG) (также FPG для параллельных алгоритмов)
u8'U', u8'T', u8'F', u8'8'
символьные литералы (строка уже существует)
унаследованные конструкторы исправлены в некоторых случаях с угловыми углами (см. P0136R0 для примеров изменений поведения)
std::string
как ссылочный символ или подстрокаstring const&
снова. Кроме того, можно сделать разбор по баджллиону раз быстрее."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...)>
, но, по-видимому, менее запутанным? [class.directory_iterator]
и [class.recursive_directory_iterator]
fstream
можно открыть с помощью path
s, а также с помощью строк const path::value_type*
.
for_each_n
reduce
transform_reduce
exclusive_scan
inclusive_scan
transform_exclusive_scan
transform_inclusive_scan
Добавлен для целей потоковой передачи, открыт, даже если вы не используете их в потоковом
atomic<T>
::is_always_lockfree
std::lock
при блокировке более одного мьютекса за раз.std
и связанных с ними механизмов[func.searchers]
и [alg.search]
std::function
для распределителей std::sample
, выборка из диапазона?
try_emplace
и insert_or_assign
Спланирование для map<>
, unordered_map<>
, set<>
и unordered_set<>
non-const .data()
для строки.
non-member std::size
, std::empty
, std::data
std::begin
/end
Семейство функций emplace
теперь возвращает ссылку на созданный объект.
unique_ptr<T[]>
исправления и другие unique_ptr
щипки.weak_from_this
и некоторые исправлены для совместного использования этогоstd
улучшения типа данных:{}
построение std::tuple
и другие улучшенияБиблиотека С++ 17 основана на C11 вместо C99
Зарезервировано std[0-9]+
для будущих стандартных библиотек
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::less
.<codecvt>
memory_order_consume
result_of
, заменен на invoke_result
shared_ptr::unique
, это не очень потокобезопасноУ Isocpp.org есть, есть независимый список изменений с С++ 14; он был частично разграблен.
Естественно, что работа TS продолжается параллельно, поэтому есть некоторые TS, которые не совсем зрелые, что придется ждать следующей итерации. Целью следующей итерации является С++ 20, как планировалось ранее, а не С++ 19, как предполагают некоторые слухи. С++ 1O удалось избежать.
Исходный список, взятый из этот пост reddit и этот пост reddit, с ссылками, добавленными через googling или с указанной выше страницы isocpp.org.
Дополнительные записи, разграбленные из SD-6 списка функций.
список функций clang и список функций библиотеки следующие быть разграбленным. Это не кажется надежным, так как это С++ 1z, а не С++ 17.
эти слайды имели некоторые функции, отсутствующие в других местах.
В то время как "то, что было удалено" не было задано, вот краткий список нескольких вещей ((главным образом?) предыдущих устаревших), которые удалены в С++ 17 из С++:
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 (структурированные привязки node)
P0521R0 (общий счет использования указателей и уникальные изменения?)
https://isocpp.org/files/papers/p0636r0.html