Які нові функції в C ++ 17?


1007

Тепер функція C ++ 17 завершена, тому навряд чи відбудеться великих змін. Сотні пропозицій було висунуто для С ++ 17.

Які з цих функцій були додані до C ++ у C ++ 17?

Якщо ви використовуєте компілятор C ++, який підтримує "C ++ 1z", яка з цих функцій буде доступна, коли компілятор оновлюється до C ++ 17?


26
Повний перелік функцій за Clang: бібліотека , мова основної мови .
Керрек СБ

3
У цього блогу є хороший підсумок: bfilipek.com/2017/01/cpp17features.html
atb

13
Див офіційні зміни C ++ 14 та C ++ 17 DIS (P0636r0) для переліку основних змін від C ++ 14 до C ++ 17.
jotik

1
@RaghavNavada Чудово! Чи підтримується розділ C ++ 20? Там # 53 , але це закрито ...
LF

Все на цьому веб-сайті en.cppreference.com/w/cpp позначене необхідною версією.
jw_

Відповіді:


1266

Мовні особливості:

Шаблони та загальний код

Лямбда

Атрибути

Очищення синтаксису

Очисник з багатоповерховим регулюванням та регулюванням потоку

  • Структуровані палітурки

    • В основному, першокласні 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

    • Багато запитувана функція для спрощення майже загального коду.

Різне

Бібліотечні доповнення:

Типи даних

  • std::variant<Ts...>

    • Майже-завжди не порожній останній я перевірив?
    • Позначений тип союзу
    • {приголомшливий | корисний}
  • std::optional

    • Можливо, тримає щось у чомусь
    • Смішно корисний
  • std::any

    • Зберігає одне з усього, що можна скопіювати
  • std::string_view

    • 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

Файлова система TS v1

Нові алгоритми

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • Додано для цілей різьблення, виставляється навіть у тому випадку, якщо ви не використовуєте їх з потоком

Нитки

(частини) Основи бібліотеки TS v1, не охоплені вище чи нижче

Поліпшення контейнера

Розумний вказівник змінюється

Інші stdвдосконалення типу даних:

Різне

Риси

Застарілий

Isocpp.org має незалежний перелік змін після C ++ 14; воно частково розграбовано.

Природно, робота з ТС триває паралельно, тому є деякі ТС, не зовсім стиглі, яким доведеться чекати наступної ітерації. Мета наступної ітерації - C ++ 20, як було заплановано раніше, а не C ++ 19, як випливало з деяких чуток. C ++ 1O уникнуто.

Початковий список, взятий із цієї публікації reddit і цієї публікації reddit , із посиланнями, доданими через googling або із зазначеної вище сторінки isocpp.org.

Додаткові записи розроблені зі списку тестів SD-6 .

Список функцій дзвону в і бібліотеці список функцій знаходяться поруч розкрадатимуться. Це не здається надійним, оскільки це C ++ 1z, а не C ++ 17.

ці слайди мали деякі функції, відсутні в інших місцях.

У той час як "те, що було видалено" не запитували, ось короткий список кількох речей ((переважно?) Попереднього застарілого), які видаляються в C ++ 17 з C ++:

Видалено:

Були перемовки. Я не впевнений, чи вони впливають на код, чи вони просто очищають стандарт:

Документи, які ще не вбудовані у вище:

  • P0505R0 (constexpr chrono)

  • P0418R2 (атомні налаштування)

  • P0512R0 ( виправлення аргументів шаблону)

  • P0490R0 (структуровані зв'язки)

  • P0513R0 (зміни до std::hash)

  • P0502R0 (паралельні винятки)

  • P0509R1 (оновлення обмежень на обробку виключень)

  • P0012R1 (зробити специфікації виключення частиною системи типу)

  • P0510R0 (обмеження на варіанти)

  • P0504R0 (теги на вибір (варіант) / будь-який)

  • P0497R0 (спільне налаштування ptr)

  • P0508R0 (структуровані ручки прив'язки вузлів)

  • P0521R0 (кількість використаних покажчиків та унікальні зміни?)

Спеціальні зміни:

Подальша довідка:


2
Гм, memory_order_consumeздається, не офіційно застаріло. Це просто відволікається в записці. Може бути, має сенс згадати про це (наприклад, із задніми дужками)?
LF
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.