C++17

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

С++17 (также известный как C++1z) — это название версии стандарта C++ ISO/IEC. Спецификации для C++17 были опубликованы в декабре 2017 года[1][2].

Возможности[править | править код]

  • Стандартная библиотека языка Си была обновлена и адаптирована с версии C99 до C11[3];
  • Добавления текстового сообщения по-умолчанию для static_assert[4];
  • Удаление триграфов[5][6];
  • Использование typename в параметрах шаблона, находящегося внутри параметров другого шаблона[7];
  • Новые правила вывода типа для auto из списка инициализации (std::initializer_list)[8][9];
  • std::uncaught_exceptions, как замена std::uncaught_exception[10][11];
  • Определение вложенных пространств имён:[9][12] namespace A::B {};
  • Атрибуты для перечислений и пространств имён[11][13];
  • Символьные литералы UTF-8[11][14];
  • Оценка константности для всех нетипизированных аргументов шаблонов[11][15];
  • Упакованные выражения[11][16]template<typename... As> void foo(As... args) { return (args && ...); } ;
  • Новые методы вставки для std::map и std::unordered_map[17][18];
  • Унифицированный доступ к размеру контейнеров[18][19] std::size();
  • Определение «Смежный итератор»[18][20];
  • Удаление некоторых устаревших типов и функций, например, таких как std::auto_ptr, std::random_shuffle или старых функциональных адаптеров[21][9];
  • Библиотека файловой системы, основанная на boost::filesystem[22];
  • Параллельные версии алгоритмов STL[23];
  • Некоторые математические функции[24];
  • Большую часть экспериментальной библиотеки TS I[25].
  • Новый синтаксис для распаковки пар, кортежей и прочих типов, для которых реализован std::get. Например: auto x = std::make_tuple(4,6,7); auto [a,b,c] = x;
  • Инициализация переменной в if и switch. Например: if(auto a = getA(); a.isValid()) {}
  • Автоматический вывод аргументов шаблона класса; также поддерживается ручное указание правил вывода.

См. также[править | править код]

Ссылки[править | править код]

  • Черновик стандарта, N4659, от 21.03.2017

Примечания[править | править код]

  1. ISO/IEC 14882:2017.
  2. Recent milestones: C++17 nearly feature-complete, second round of TSes now under development
  3. C++17 should refer to C11 instead of C99.
  4. N3928: Extending static_assert, v2 (Walter E. Brown).
  5. N3981: Removing trigraphs??! (Richard Smith) (6 мая 2014).
  6. IBM comment on preparing for a Trigraph-adverse future in C++17, IBM paper N4210, 2014-10-10.
  7. N4051: Allow typename in a template template parameter (Richard Smith).
  8. N3922: New Rules for auto deduction from braced-init-list (James Dennett).
  9. 1 2 3 Updates to my trip report.
  10. N4259: Wording for std::uncaught_exceptions (Herb Sutter).
  11. 1 2 3 4 5 New core language papers adopted for C++17.
  12. N4230: Nested namespace definition (Robert Kawulak, Andrew Tomazos).
  13. N4266: Attributes for namespaces and enumerators (Richard Smith).
  14. N4267: Adding u8 character literals (Richard Smith).
  15. N4268: Allow constant evaluation for all non-type template arguments (Richard Smith).
  16. N4295: Folding expressions (Andrew Sutton, Richard Smith).
  17. N4279: Improved insertion interface for unique-key maps (Thomas Köppe).
  18. 1 2 3 New standard library papers adopted for C++17.
  19. N4280: Non-member size() and more (Riccardo Marcangelo).
  20. N4284: Contiguous Iterators (Jens Maurer).
  21. N4190: Removing auto_ptr, random_shuffle(), And Old <functional> Stuff (Stephan T. Lavavej).
  22. Filesystem Library Proposal (Beman Dawes).
  23. The Parallelism TS Should be Standardized.
  24. Mathematical Special Functions for C++17, v5.
  25. Adopt Library Fundamentals V1 TS Components for C++17 (R1).