Ответ 1
Особенности языка:
Шаблоны и общий код
-
Вывод аргумента шаблона для шаблонов классов
- Как то, как функции выводят аргументы шаблона, теперь конструкторы могут выводить аргументы шаблона класса
- http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
-
- Представляет значение любого типа (тип шаблона).
Lambda
-
- Lambdas неявно constexpr, если они квалифицируются
-
-
[*this]{ std::cout << could << " be " << useful << '\n'; }
-
Атрибуты
-
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
атрибуты -
using
в атрибутах, чтобы избежать повторения пространства имен атрибутов. -
Теперь компиляторы должны игнорировать нестандартные атрибуты, которые они не распознают.
- С++ 14 разрешает компиляторам отклонять неизвестные атрибуты с областью.
Очистка синтаксиса
-
- Как встроенные функции
- Компилятор выбирает экземпляр экземпляра
- Устареет статический constexpr redeclaration, теперь неявно встроенный.
-
Простой
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
.
-
- Работает с 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 разумно.
-
-
Обобщающий диапазон для циклов
- Появляется в основном поддержка часовых или конечных итераторов, которые не являются тем же типом, что и итераторы, которые помогают с циклами с нулевым концом и т.д.
-
- Очень часто запрашиваемая функция упрощает почти общий код.
Разное
-
Динамическое распределение памяти для перенастроенных данных
-
Гарантированное копирование текста
- Наконец-то!
- Не во всех случаях, но различает синтаксис, где вы "просто создаете что-то", которое было названо elision, от "подлинного elision".
-
Исправлен порядок оценки для (некоторых) выражений с некоторыми модификации
- Не считая аргументов функции, но теперь функция запрета оценки параметров аргумента функции запрещена
- Делает большую часть работы с поврежденным кодом и делает
.then
для будущей работы.
-
Перспективные гарантии прогресса (FPG) (также FPG для параллельных алгоритмов)
- Я думаю, что это говорит: "реализация может не останавливать потоки навсегда"?
-
u8'U', u8'T', u8'F', u8'8'
символьные литералы (строка уже существует) -
- Проверить, включен ли заголовочный файл,
- делает переход от экспериментального к std почти бесшовным.
-
унаследованные конструкторы исправлены в некоторых случаях с угловыми углами (см. P0136R0 для примеров изменений поведения)
Добавления в библиотеку:
Типы данных
-
- Почти всегда не пустое последнее, что я проверил?
- Маркированный тип объединения
- {устрашающий | полезно}
-
- Может быть, есть что-то из
- Смешно полезно
-
- Удерживает одно (что можно скопировать)
-
-
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
- 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.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
-
Добавлен для целей потоковой передачи, открыт, даже если вы не используете их в потоковом
Threading
-
- Untimed, который может быть более эффективным, если он вам не нужен.
-
atomic<T>
::is_always_lockfree
-
- Сохраняет боль в
std::lock
при блокировке более одного мьютекса за раз.
- Сохраняет боль в
-
- Связанная бумага с 2014 года может быть устаревшей.
- Параллельные версии алгоритмов
std
и связанных с ними механизмов
(части) Основы библиотеки TS v1 не указаны выше или ниже
-
[func.searchers]
и[alg.search]
- Алгоритм поиска и методы
-
- Полиморфный распределитель, например
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<>
- Переместить узлы между контейнерами дешево.
- Слияние целых контейнеров дешево.
-
non-const
.data()
для строки. -
non-member
std::size
,std::empty
,std::data
- like
std::begin
/end
- like
-
Семейство функций
emplace
теперь возвращает ссылку на созданный объект.
Изменения интеллектуального указателя
-
unique_ptr<T[]>
исправления и другиеunique_ptr
щипки. -
weak_from_this
и некоторые исправлены для совместного использования этого
Другие std
улучшения типа данных:
-
{}
построениеstd::tuple
и другие улучшения - TriviallyCopyable reference_wrapper, может быть повышение производительности
Разное
-
Библиотека С++ 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>
- like
std::less<void>
, но для интеллектуальных указателей для сортировки на основе содержимого
- like
-
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, косвенность по(прерывает ABI некоторых компиляторов из-за изменения имени, удаляется.)std::less
.
Черты характера
Устаревшие
- Некоторые библиотеки C,
-
<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;
- триграфы
- Если вы все еще нуждаетесь в них, они теперь являются частью кодировки исходного файла, а не частью языка.
- псевдонимы ios
- auto_ptr, старый
<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
- Здесь должно быть обновлено до "Модификации существующих функций".