Утверждён стандарт C++20

Кoмитeт ISO пo стaндaртизaции языкa C++ утвeрдил мeждунaрoдный стaндaрт "C++20". Прeдстaвлeнныe в спeцификaции вoзмoжнoсти, зa исключeниeм eдиничныx случaeв, пoддeрживaются в кoмпилятoрax GCC, Clang и Microsoft Visual C++. Пoддeрживaющиe C++20 стaндaртныe библиoтeки рeaлизoвaны в рaмкax прoeктa Boost. В слeдующиe двa мeсяцa утвeрждённaя спeцификaция будeт нaxoдиться нa стaдии подготовки документа к публикации, получи и распишись которой будет проведена работа ровно по редакторской правке орфографических ошибок и опечаток. В начале ноября чистый вариант документа будет направлен в ISO на публикации под формальным именем ISO/IEC 14882:2020. Тем временем, совет уже приступил к работе над следующим стандартом C++23 (C++2b) и держи ближайшем виртуальном совещании рассмотрит возможные новшества. Концепции допускается применять для того, чтобы избежать логических несоответствий в среде свойствами типов данных, используемых (во)внутрь шаблона, и свойствами типов данных входных параметров. template‹typename T› concept EqualityComparable = requires(T a, T b) { { a == b } -> std::boolean; { a != b } -> std::boolean; }; В контингент приняты расширения для работы с модулями, которые только и остается использовать вместо заголовочных файлов. Модули предоставляют новейший способ организации исходных текстов в основании определения границ компонентов, лишенный чего подключаемых через "#include" заголовочных файлов. Макрос __VA_OPT__ угоду кому) адаптивного раскрытия вариативных макросов в зависимости через наличия токенов в вариативном аргументе. Подпора оператора "" для трехстороннего сравнения. Протекция инициализаторов элементов по умолчанию на битовых полей. Возможность лямбда-захвата выражений "*this". struct int_value { int n = 0; auto getter_fn() { // BAD: // return [=]() { return n; }; // GOOD: return [=, *this]() { return n; }; } }; Картель элементов по указателю (Pointer-to-member), используя определённые сквозь выражение "const &" указатели сверху временные объекты. Классам разрешено оборот параметры шаблона без типа. struct foo { foo() = default; constexpr foo(int) {} }; template ‹foo f› auto get_foo() { return f; } get_foo(); // uses implicit constructor get_foo‹foo{123}›(); Никак не сохраняемые лямбда-выражения с конструктором. Эвенту использования строковых литералов в параметрах шаблона. Содействие синтаксиса инициализации в стиле Си - наяву не перечисленные в списке инициализации полина, инициализируются по умолчанию. struct A { int x; int y; int z = 123; }; A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2 Палочка-выручалочка пустых членов структур данных. Содействие атрибутов likely и unlikely для информирования оптимизатора о вероятности срабатывания условной конструкции ("[[likely]] if (random › 0) {"). Достижимость использования диапазонов для инициализации значений переменной в цикле "for" for (auto v = std::vector{1, 2, 3}; auto& e : v) { Автоматическое прикидка размера массива в new ("new double[]{1,2,3}"); Причиндалы "[[no_unique_address]]" возле котором переменные без данных неважный (=маловажный) занимают места. Атомарные указатели (std::atomic‹shared_ptr‹T›› и std::atomic‹weak_ptr‹T››). Виртуальность вызова виртуальных функций в условных выражениях. Пособничество быстрых (immediate) функций, которые могут корпеть только с константами. consteval int sqr(int n) { return n * n; } constexpr int r = sqr(100); // OK int x = 100; int r2 = sqr(x); // ERROR: 'x' приставки не- может использоваться как константа Случай применения constexpr с виртуальными функциями ("constexpr virtual int f() const { return 2; }"). В стандартной библиотеке: Добавлена помощник типа char8_t для строк UTF-8. Добавлены заголовочные файлы bit (битовые операции) и version. Появилась риск проверки префикса и суффикса строк (starts_with, ends_with). Добавлены типажи std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible и std::type_identity. Добавлены функции std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated и std::assume_aligned. В std::make_shared добавлена поддержание массивов. Добавлена функция std::to_array для того преобразования похожих на массив объектов в std::array. Сильнее удобный синтаксис перечислений: enum class rgba_color_channel { red, green, blue, alpha }; std::string_view to_string(rgba_color_channel my_channel) { switch (my_channel) { using enum rgba_color_channel; case red: return "red"; case green: return "green"; case blue: return "blue"; case alpha: return "alpha"; } } В индексах изо-за неопределённого поведения запрещено употребление операции "," ("a[b,c]"). Прекращена помога большинства операций с переменными, объявленными с ключевым словом сказать volatile, в том числе запрещены операции "++" и "--" со стандартными типами. Шпрундель: http://www.opennet.ru/opennews/art.shtml?num=53670