C ++ 17 теперь полностью готов, поэтому вряд ли он претерпит большие изменения. Сотни предложений были выдвинуты для C ++ 17.
Какие из этих функций были добавлены в C ++ в C ++ 17?
При использовании компилятора C ++, который поддерживает «C ++ 1z», какие из этих функций будут доступны при обновлении компилятора до C ++ 17?
Вывод аргумента шаблона для шаблонов классов
(Складывание + … + выражения) а также Ревизии
[*this]{ std::cout << could << " be " << useful << '\n'; }
[[fallthrough]]
, [[nodiscard]]
, [[maybe_unused]]
атрибуты
using
в атрибутах чтобы избежать необходимости повторять пространство имен атрибута.
Компиляторы сейчас требуется игнорировать нестандартные атрибуты, которые они не распознают.
просто 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 разумно.Обобщение на основе диапазона для петель
Исправлен порядок оценки (некоторых) выражений с некоторыми изменения
.then
на будущую работу.Форвардные гарантии прогресса (FPG) (также, FPG для параллельных алгоритмов)
u8'U', u8'T', u8'F', u8'8'
символьные литералы (строка уже существует)
унаследованные конструкторы исправляет некоторые угловые случаи (см. P0136R0 за примеры изменения поведения)
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...)>
но видимо менее запутанным?[class.directory_iterator]
а также [class.recursive_directory_iterator]
fstream
с можно открыть с помощью path
с, а также с 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<>
неконстантная .data()
для строки.
нечлен std::size
, std::empty
, std::data
std::begin
/end
emplace
семейство функций теперь возвращает ссылку на созданный объект.
unique_ptr<T[]>
исправления и другие unique_ptr
твики.weak_from_this
и некоторые исправлены, чтобы поделиться с этимstd
улучшения типа данных:{}
возведение std::tuple
и другие улучшенияБиблиотека C ++ 17 основана на С11 вместо С99
Зарезервированный 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 имеет имеет независимый список изменений, начиная с C ++ 14; это было частично разграблено.
Естественно, работа TS продолжается параллельно, поэтому есть некоторые TS, которые еще не созрели и должны будут ждать следующей итерации. Целью следующей итерации является C ++ 20, как планировалось ранее, а не C ++ 19, как предполагают некоторые слухи. C ++ 1O удалось избежать.
Первоначальный список взят из этот реддит пост а также этот реддит пост, со ссылками, добавленными через поиск в Google или со страницы выше isocpp.org.
Дополнительные записи разграблены с SD-6 список функциональных тестов.
Список возможностей Clang а также список функций библиотеки рядом будут разграблены. Это не кажется надежным, так как это 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
Других решений пока нет …