Для установки нажмите кнопочку Установить расширение. И это всё.

Исходный код расширения WIKI 2 регулярно проверяется специалистами Mozilla Foundation, Google и Apple. Вы также можете это сделать в любой момент.

4,5
Келли Слэйтон
Мои поздравления с отличным проектом... что за великолепная идея!
Александр Григорьевский
Я использую WIKI 2 каждый день
и почти забыл как выглядит оригинальная Википедия.
Статистика
На русском, статей
Улучшено за 24 ч.
Добавлено за 24 ч.
Что мы делаем. Каждая страница проходит через несколько сотен совершенствующих техник. Совершенно та же Википедия. Только лучше.
.
Лео
Ньютон
Яркие
Мягкие

Из Википедии — свободной энциклопедии

C++26 или C++2c (латиницей), или Си++26 (кириллицей) — ожидаемый стандарт языка программирования C++. Разработка началась сразу же после того, как в феврале 2023 года зафиксировали Си++23.

Название

Си++0x должен был приблизить порядком устаревший Си++ к современным языкам, непрерывно разрабатываемым под руководством единоличника. (Си++ разрабатывается комитетом и есть много реализаций — в отличие от, например, Python.) Но стандарт запоздал, и с версии 14 новый язык выпускают не «когда готово», а раз в три года, при этом последний год — только доводка. Потому ещё до окончания работы над версией 23 стандарт называли «Си++26».

Заседания

  1. 12…16 июня 2023, Варна (Болгария)[1] — первое после пандемии КОВИДа очное заседание.
  2. 6…11 ноября 2023, Каилуа-Кона (Гавайи, США)[2]
  3. 18…23 марта 2024, Токио (Япония)[3].
  4. Июнь 2024, Сент-Луис (Миссури, США) — ожидается[4]
  5. Ноябрь 2024, Вроцлав (Польша) — ожидается

Запрещены и удалены

Удалены из языка

  • Любые операции между enum и дробным; enum и другим enum. Ошибкоопасное наследие Си. Запрещены в Си++20, операция «звездолёт» <=> никогда не разрешалась[5]. Использовать явное преобразование типов. Может бросить тень на совместимость с Си, обходится легко: +C1 + C2.
  • Функции больше не могут возвращать ссылку на временный объект[6]. На стековый пока ещё могут.

Диагностика доступа до инициализации

Доступ до инициализации — это известный источник ошибок, и теперь запрещён в очень ограниченном виде — только на стеке[7]. Если действительно неопределённое значение нужно — использовать новый атрибут [[indeterminate]].

union всегда считается инициализированным полностью. На объекты в «куче» диагностика не распространяется.

void h() {
  int d1, d2;

  int e1 = d1;           // теперь ошибка
  int e2 = d1;           // теперь ошибка

  assert(e1 == e2);      // выполняется, OK
  assert(e1 == d1);      // выполняется, ошибка
  assert(e2 == d1);      // выполняется, ошибка

  std::memcpy(&d2, &d1, sizeof(int)); // OK, но у d2 теперь ошибочное значение
  assert(e1 == d2);      // выполняется, ошибка
  assert(e2 == d2);      // выполняется, ошибка
}

void f(int);

void g() {
  int x [[indeterminate]], y;
  f(y);     // ошибка
  f(x);     // неопределённое поведение
}

Удалены из библиотеки

  • Весь заголовок <codecvt> — нет обработки ошибок[8]. При преобразовании кодировок, даже разных форматов сериализации Юникода вроде UTF-816, в зависимости от того, откуда источник взялся, какой вред может нанести и что лучше для пользователя, возможно: объявить общую аварию программы, сообщить о плохих данных, опустить неудачные последовательности, поставить на их месте U+FFFD � replacement character или что-то ещё. Запрещён в Си++17. Использовать внешние, более управляемые функции.
  • allocator<T>::is_always_equal[9]. Ошибкоопасен при наследовании от аллокатора, в котором этот is_always_equal есть. Запрещён в Си++20, для проверки возможностей аллокатора использовать allocator_traits. Использовать в собственных аллокаторах, когда это действительно играет роль.
  • string.reserve() без параметров, эквивалентный reserve(0)[10]. Со старым API строк (Си++98…17) использовалось как shrink_to_fit, им же и заменено. В Си++20 reserve больше не укорачивает строку, а данную перегрузку запретили.
  • strstream — запрещён давным-давно в Си++98 из-за опасности переполнения буфера[11]. Использовать spanstream (Си++20).
  • wstring_convert (заголовок <locale>) — запрещён в Си++17 из-за сложности[12].
  • Атомарный API shared_ptr — запрещён в Си++20, использовать atomic[13].

Снят запрет

  • polymorphic_allocator.destroy — запрещено в Си++20. Пусть это же можно сделать и через allocator_traits, так короче[14].

Язык

Разные изменения в языке

  • Параметром-значением в шаблонах (non-type template parameter) может стать и вызов конструктора. Указано, когда такой вызов возможен, а когда нет[15].
  • Получение i-го объекта пакета параметров как void f(T&&... t) { g(std::forward<T...[0]>(t...[0])); }[16]. Формально это несколько бьёт по имеющемуся коду: void f(T...[0]){} представляло собой параметры без имён — пакет массивов, но по факту даже не компилировалось в MSVC и G++. C# и D поддерживают и i-й параметр с конца, но отрицательные числа для этого ошибкоопасны, а более сложный синтаксис решено не просить. Главная причина — ускорение компиляции: пакетные шаблоны часто исполняются за O(n²) и с глубокой вложенностью.
  • Теперь можно навешивать атрибуты и на структурные переменные: auto [a, b [[vendor::attribute]], c] = f();[17]. Конкретного назначения пока нет, и единственный стандартный атрибут, который теоретически имеет смысл,— [[maybe_unused]].
  • =delete("причина"). Например: A<T> factory(const T&&) = delete("Опасно висячими ссылками");[18].

Конструируемые строки в static_assert

Для начала придумали понятие «невычисляемая строка» (unevaluated string): закавыченная строка, значение которой не проходит в скомпилированную программу, а нужно только компилятору. Они являются частью _Pragma, asm, [[nodiscard]]… — и, конечно, static_assert[19]. Им запрещается иметь префикс кодировки.

Впоследствии позволили в static_assert любую константно вычисляемую строку[20]:

// Было
template <typename T, auto Expected, unsigned long Size = sizeof(T)>
constexpr bool ensure_size() {
  static_assert(sizeof(T) == Expected, "Unexpected sizeof");
  return true;
}
static_assert(ensure_size<S, 1>());
// Остаётся надеяться, что компилятор напишет, что дело было в ensure_size<int, 1, 4>
// Стало
static_assert(sizeof(S) == 1,
    std::format("Unexpected sizeof: expected 1, got {}", sizeof(S));
// Unexpected sizeof: expected 1, got 4

constexpr format намеренно не внесён, но его прообраз, библиотека libfmt, уже способна на constexpr.

Имя _ может повторяться

auto [x, y, _] = f(); — давно устоявшаяся манера программирования, когда функция возвращает три поля, а нужны два, особенно если возвращается неговорящий тип вроде tuple. Второй вариант — когда нужен именованный объект, но имя не важно: захват мьютекса lock_guard _(someMutex). На случай, когда таких подчерков несколько, идиому расширили:[21]

namespace a {
  auto _ = f();
  auto _ = f(); // Остаётся ошибка: с глобальными переменными не работает
}
int _;
void f() {
  using ::_;   // Остаётся OK, добавление в пространство имён постороннего символа
  auto _ = 42; // Теперь OK
  using ::_;   // Остаётся ошибка: using _ разрешено только до локальной _
  auto _ = 0;  // Теперь OK
  static int _; // Остаётся ошибка: статическим переменным нужно говорящее имя
  {
    auto _ = 1;       // Остаётся OK, замещение
    assert( _ == 1 ); // Остаётся OK, имеем дело с замещённой переменной
  }
  assert( _ == 42 );  // Ошибка: которая из двух?
}
enum MmapBits {
  Shared,
  Private,
  _,
  _,   // OK: пропустить два
  Fixed,
  Rename,
};

Для функций, типов, using и концепций новый механизм бесполезен: этим объектам либо нужно говорящее имя, либо Си++ уже даёт подходящие механизмы вроде безымянных типов.

Расширен constexpr

  • Преобразование указателей в void*, а потом обратно в свой тип[22]. Преобразование в посторонние типы неконстантно. Используется для так называемого стирания типа — при выполнении информация хранится в переменной общего типа, но её обработка выстраивается так, что все преобразования в исходный тип верны. (Так устроены, например, обобщённые типы Java.) В CLang механизм уже есть (потребовался для выделения памяти) и вынести наружу ничего не стоит, G++ и EDG не видят препятствий. По заявлениям Г. Саттера, это шаг к constexpr format[23].

Вариативный friend

Одно из назначений оператора friend — объекты-утилиты, сделанные через рекурсивные шаблоны. Если шаблон вариативный, то и его друзья тоже вариативны.

Пример: так называемый passkey, идиома Си++, используемая, если скрытую функцию надо вызвать из шаблона (обычно make_unique/make_shared). Чтобы шаблон имел к ней доступ, функция должна быть общедоступной, и скрывают не её, а параметр-затычку, так называемый passkey, который так просто не получишь.

// Вариативный passkey
template<class... Ts>
class Passkey {
  friend Ts...;
  Passkey() {}
};

class C {
public:
  // Можно вызвать только из Blarg, Blip и Baz
  void intentional(Passkey<Blarg, Blip, Baz>);
};

// Раскрыть класс для внутреннего объекта
template<class... Ts>
struct VS {
  template<class U>
  friend class C<Ts>::Nested...;
};

Редакционные правки

  • Стандартизирован лексический анализатор: сращиванием строк текста через \⤶ и склеиванием лексем через препроцессорное ## можно получить имя символа; переводы строк внутри закавыченной строки запрещены. Это статус-кво, поддерживаемый G++, CLang и EDG[24].
  • Некодируемые строковые литералы (например, из-за отсутствия конкретного символа в кодировке исполнения) запрещены[25].
  • Уточнены правила игнорирования стандартных атрибутов[26]:
    • Атрибут должен быть синтаксически корректным по правилам текущего Си++ — иначе ошибка. (Уже в Си++23[23] и только добавлено примечание.)
    • Убирание атрибута из корректной программы может менять её внешнее поведение, но не может придумывать новое — лишь ограничивать до одного из допустимых вариантов, когда атрибут есть. (Также в Си++23.)
    • Псевдофункция препроцессора __has_cpp_attribute должна проверять, реагирует ли компилятор на данный атрибут (а не разбирает ли) — а если разбирает, но не реагирует, атрибут бесполезен и макросы совместимости должны развёртываться в компиляторозависимые функции вроде __builtin_assume. (А это новое правило.)
  • Экземпляры initializer_list по возможности хранятся в сегменте данных, желательно неизменяемом[27].
  • Требования к generate_canonical переписаны так, чтобы сохранялись статистические свойства на всём диапазоне [0,1) — и результирующее число никогда из-за недостатков дробной арифметики не стало бы единицей[28].
  • Переписано, когда можно опускать скобки при агрегатной инициализации: Point x[2] = { 1, 2, 3, 4 };[29].
  • Заголовок модуля не может быть макросом — это усложняет его обработку системой сборки[30]. Импорт может — не вызывает таких сложностей.
  • Пустой бесконечный цикл — больше не неопределённое поведение[31]. CLang в таких ситуациях «ухитрялся» исполнить посторонний код.

Гармонизация с Си

  • В набор символов внесены остатки печатного ASCII @$`, которые когда-нибудь на что-нибудь пригодятся[32]. Ранее в Си23 добавили @$, в первую очередь из-за EBCDIC, где в разных вариантах «собака» в разных местах и надо её идентифицировать и корректно перекодировать[33].
  • Выкинут strtok из автономной библиотеки вслед за Си[34] — содержит внутреннее состояние. Большинство реализаций используют потоколокальные переменные, которые в автономной среде могут отсутствовать.
  • Переписан макрос assert, чтобы лучше поддерживались шаблоны и многомерная индексация, коих просто не существовало на момент появления препроцессора Си[35].

Библиотека

Разные изменения в библиотеке

  • Простейшая[к 1] библиотека идентификации кодировки исполнения[36].
  • Получение системного дескриптора из fstream[37]. Может использоваться в высоконадёжном программировании, когда надо гарантированно записать данные на диск[38].
  • Поддержка отладчика. Новый заголовочный файл <debugging> с тремя функциями: breakpoint(), breakpoint_if_debugging(), bool is_debugger_present()[39].

Автономная библиотека

Автономная (freestanding) библиотека не полагается на системные вызовы (даже выделение памяти), выброс исключений (требует серьёзной работы со стеком), может быть написана даже на чистом Си++ и потому полностью кроссплатформенна.

  • Возможен (не обязателен) operator new, возвращающий nullptr, приводящий к системной аварии или делающий что угодно по желанию реализатора. Добавлен макрос __cpp_lib_has_default_operator_new, проверяющий, возможно ли выделение памяти — например, вместо динамического std::vector могут использоваться массивы ограниченного размера[40].
  • Множество функций Си, включая строковые и математические, а также <charconv> и char_traits[41].
  • algorithm, array, optional, variant, string_view[42]. Переписаны монадные функции optional так, чтобы не ссылались на неавтономный (выбрасывающий исключения) value.
  • expected, span, mdspan[43].
  • Выкинут strtok вслед за Си[34] — качественная реализация использует потоколокальные переменные, которые в автономной среде могут отсутствовать.

Новые constexpr

  • Устойчивая сортировка[44].
  • consteval bool is_within_lifetime(&union_.field) — «волшебная» (реализованная внутри компилятора) функция, проверяющая, держит ли union то или иное поле[45]. Тип union при компиляции изначально (с Си++11) помеченный на манер variant, Си++20 позволил менять активное поле при компиляции, а доступ к другому полю отключает constexpr. Используется для экстремальной оптимизации по памяти с сохранением константности — например, для однобайтового optional<bool>.
  • Больше математических функций, включая комплексные[46].

Перевод данных в строку и наоборот

  • from_chars_result получил operator bool[47] — проверку кода ошибки.
  • to_string для дробных выдаёт то же, что и format("{}", x) — в компактном нелокализованном виде. Ранее он был унифицирован с printf("%f", x), то есть обращался к глобальной локали (ненадёжно, да и вычисление нужных параметров локали затратно)[38] и плохо работал со слишком большими/малыми числами[48].
  • stringstream можно инициализировать строками string_view[49].
  • То же самое с bitset[50].
  • string + string_view[51]. Изначально в операции отказали из-за особенностей архитектуры LLVM — всё, что можно, она исполняет «лениво», и append точками следования фиксирует, где исполнять, а сложение в большом выражении может выйти за время жизни string_view. Так что целых пять редакций — это попытка найти наиболее удачную реализацию.

format

  • Унифицировано форматирование указателей[52].
  • Параметры ширины теперь также проверяются при компиляции[53].
  • Форматирование строк, заранее не известных: std::vformat(str, std::make_format_args(path.string()));std::format(std::runtime_format(str), path.string());. Первое предназначено для писателей своих обёрток над форматированием вроде doLog(str, args...), а не для конечных пользователей, и склонно к ошибкам: make_format_args содержит string_view, и если его вытащить в отдельную переменную, string_view будет жить дольше, чем временная строка. Для надёжности тонкая обёртка runtime_format_string принимается только по временной ссылке[54].
  • В само́м make_format_args избавились от std::forward и временных объектов, делая форматирование более устойчивым к висячим ссылкам[55].
  • Серьёзная ошибка, ранее случившаяся в fmt: кодовые единицы char, будучи отформатированы как числа или с «широкой» форматной строкой, выдавали зависящий от реализации вид[56]. Теперь char, отформатированный как число, будет unsigned; отформатированный как символ в широком контексте — символом с кодом 0…255.
  • Форматирование path[57].

print

  • println() без параметров[58].
  • print может захватывать или не захватывать мьютекс вывода в зависимости от того, как происходит преобразование: преобразовать в строку целиком, потом вывести (например, для чисел), или параллельно преобразование-вывод (например, для массивов)[59].

Изменения в функциональном программировании

  • Добавлена copyable_function, построенная по принципу новой move_only_function (Си++23) и значительно более лёгкая[к 1], чем function (Си++11). Последнюю всё-таки решили не запрещать[60].
  • Добавлена совсем лёгкая function_ref, не инкапсулирующая вызываемый объект, а просто ссылающаяся на него[61].
  • Добавлен облегчённый шаблонный карринг через bind_front, если вызываемый объект (например, слот Qt) вычисляется раз и навсегда при компиляции[62].
  • This-параметры из Си++23 позволили внести одну из перегрузок visit внутрь variant[63].

Хранение данных

  • Добавлен hash для календарных типов[64].
  • Добавлен weak_ptr.owner_hash и несколько других подобных функций[65].
  • Закончен разнородный поиск в [unordered_]set/map: добавлены шаблонные insert, insert_or_assign, try_emplace, operator[], bucket[66]. Разнородный поиск начат в Си++14, и позволяет хранить с «тяжёлыми» ключами (string), а искать по «лёгким» (string_view или даже const char*).
  • Операции сравнения для reference_wrapper[67].
  • Возможность писать std::find(v.begin(), v.end(), {3, 4});[68]. Для этого всего лишь в шаблоны типа template<class T, class Allocator, class U> добавили class U=T.

Диапазоны и другие представления данных

  • Переписан projected (внутренний тип библиотеки диапазонов), лучше работающий с указателями на недоопределённые классы (class Opaque;). Многие из функций диапазонов не работали там, где работал «голый» STL[69].
  • Комплексным числам добавлено get<0> и <1>, как обычным кортежам (tuples)[70].
  • basic_const_iterator можно получить из неконстантного собрата[71].
  • views::concat[72].
  • ranges::generate_random[73].

span и mdspan

  • Функция submdspan, производящая слайсинг многомерных массивов. На выходе получается mdspan (Си++23), возможно, с нестандартным типом внутри[74].
  • Конструктор span(initalizer_list), не требующий промежуточного объекта вроде массива[75].
  • span.at(i), выкидывающий аварию[76].
  • mdspan с излишним выравниванием[77].
  • Улучшено угадывание статических габаритов mdspan, если таковые имеются[78].

Примитивы неблокирующей синхронизации

  • atomic_fetch_min/max — вычисление минимума/максимума атомарной переменной и обычной, и запись полученного обратно в атомарную[79].

Read-copy-update

Объект хранится в динамической памяти. Как только этот объект изменили, создают новый такой же, а старый, когда можно, удаляют[80].

// Было — блокирующая версия
Data* data_;
std::shared_mutex m_;

template <typename Func>
auto reader_op(Func fn) {
  std::shared_lock<std::shared_mutex> l(m_);
  Data* p = data_;
  return fn(p);
}

void update(Data* newdata) {
  Data* olddata;
  { std::unique_lock<std::shared_mutex> wlock(m_);
    olddata = std::exchange(data_, newdata);
  }
  delete olddata;
}
// Стало — не блокируются только читатели
std::atomic<Data*> data_;

template <typename Func>
auto reader_op(Func fn) {
  std::scoped_lock l(std::rcu_default_domain());
  Data* p = data_;
  return fn(p);
}

void update(Data* newdata) {
  Data* olddata = data_.exchange(newdata);
  std::rcu_synchronize();
  delete olddata;
}

Hazard pointer

Главный недостаток идиомы read-copy-update в данном исполнении — не ждут только читатели, писатель может надолго «зависать». Это «зависание» означает, что другие читатели работают и держат объект, но не всегда допустимо.

Hazard pointer дополнительно следит, какие потоки пользуются тем или иным объектом, и как только объект перестаёт использоваться, он исчезает[81].

Идиома похожа на подсчёт ссылок, но подсчитывает только локальные ссылки из функций доступа — а не глобальные ссылки между объектами. Это позволяет циклические ссылки без слежения, чей «ранг» выше (от «контейнеров» к «содержимому» — shared_ptr, в прочие стороны — weak_ptr), а также без присущего shared/weak_ptr управляющего объекта, исчезающего, когда исчезнет последний слабый указатель.

Система сделана беспрепятственной по записи ценой повышенного расхода памяти: read-copy-update хранит одно поколение старых данных, а hazard pointer — сколько угодно[38].

Поскольку G++ всё ещё держит совместимость двоичных интерфейсов, на будущие дополнения оставили 4/8 байтов на объект.

(Старая блокирующая версия — та же)
// Стало — не блокируется и писатель
struct Data : std::hazard_pointer_obj_base<Data> {}
std::atomic<Data*> pdata_;

template <typename Func>
auto reader_op(Func userFn) {
  std::hazard_pointer h = std::make_hazard_pointer();
  Data* p = h.protect(pdata_);
  return userFn(p);
}

void writer(Data* newdata) {
  Data* old = pdata_.exchange(newdata);
  old->retire();
}

Математика

Арифметика с насыщением (упором в край)

Стандартная работа беззнаковых типов — арифметика остатков: при переходе через значение превращается в 0. Знаковые — зависят от реализации. Но это не всегда нужно: например, может означать «сколько угодно» и прибавление к нему единицы должно оставлять . Никакой защиты от дурака нет. Поддерживаются четыре арифметических действия и преобразование типов. Деление с упором div_sat при делении на ноль перестаёт быть константным[83].

#include <numeric>

// Считаем, что у нас 8-битный char и отрицательные в дополнительном коде
int x1 = add_sat(3, 4);               // 7
int x2 = sub_sat(INT_MIN, 1);         // INT_MIN
unsigned char x3 = add_sat(255, 4);   // 3!! — работа в int и преобразование 259 → 3
unsigned char x4 = add_sat<unsigned char>(255, 4);   // 255
unsigned char x5 = add_sat(252, x3);  // Ошибка, нет нужной перегрузки
unsigned char x6 = add_sat<unsigned char>(251, x2);  // 251!! — преобразование INT_MIN → 0
unsigned char x7 = saturate_cast<unsigned char>(-5);  // 0

Заполненная линейная алгебра

Добавились BLAS-подобные алгоритмы линейной алгебры для заполненных (большей частью ненулевых) векторов и матриц[84]. Мотивация:

  • Комитет Си++ сам поставил линейную алгебру приоритетом.
  • Си++ — стандартная платформа для наукоёмкого ПО, которому линейная алгебра более чем нужна.
  • Это как сортировка массива: примитивные алгоритмы медленные, а самые быстрые реализации можно получить аппаратно-специфичными улучшениями.
  • В стандарте Си++ и так много разной математики — и умножение матриц не менее важно, чем функции Бесселя.
  • BLAS — известный стандарт линейной алгебры, мало менявшийся с годами.
  • Это такой же путь к интеграции в Си++ сторонних стандартов, как Юникод (идёт работа) и часовые пояса.

Конструкция полностью шаблонная и на mdspan. Преимущества перед стандартным BLAS:

  • Работают любые типы, в том числе смешанные (данные в float, расчёт в double), а не только четыре стандартных BLAS’овских.
  • Можно оптимизировать работу с матрицами небольших жёстко заданных габаритов — например, через SIMD.
  • С небольшими изменениями возможно будет запустить целый пакет заданий (например, для машинного обучения).

Пока вне рассмотрения: расширенные функции BLAS/LAPACK, разреженная алгебра, расчёты повышенной точности, тензоры («матрицы» с тремя и более измерениями), параллельная работа, перегрузка операций ±. Последняя — из-за неоднозначности (есть несколько типов умножения векторов), данные могут быть в одном типе, а работа в другом, и из-за больших объёмов памяти и многоступенчатых расчётов промежуточные буфера часто используются повторно.

Нет даже решения заполненных СЛАУ. Вот одна из стандартных функций — решение треугольной СЛАУ на месте.

template<in-matrix InMat,
         class Triangle,
         class DiagonalStorage,
         inout-vector InOutVec>
void triangular_matrix_vector_solve(
  InMat A,
  Triangle t,
  DiagonalStorage d,
  InOutVec b);

Здесь пустой тип-тэг Triangle показывает, каким треугольником собрана матрица, верхним или нижним. Аналогичный тэг DiagonalStorage — что представляет собой диагональ матрицы A: явные значения или неявные единицы. В векторе b изначально правая часть системы, в результате расчёта будет решение.

Ожидаются, но не одобрены

  • Гармонизация с Си:
    • #embed — инициализация массива данных двоичным файлом[85], прошла в Си23.
  • Примитивы хранения данных:
    • inplace_vector — массив изменяемой ограниченной длины на основе обычного массива[86].
    • Улей — специализированный менеджер памяти для однотипных данных, используемый в играх и скоростной торговле. Никогда не перемещает, объект вставляется в случайное место, относительно быстры операции «проход», «добавление» и «удаление»[87].
    • path_view, аналог string_view для путей[88]. По факту variant, способный ссылаться без хранения на пути разных форматов и оперативно перекодировать в системный вид — rendered_path, буфер достаточно больших размеров с возможностью запросить ещё больше, выделив память.
  • Многозадачность:
  • Прочее:
    • Улучшения в библиотеке диапазонов[91].
    • Замена integral_constant на более простой в использовании constexpr_v[92].
    • Улучшение рефлексии при компиляции[2].

Будут неизвестно когда

Крупные важные функции. Их давно просят, но нет гарантии, что будут готовы к сроку Си++26[93].

  • Библиотечная поддержка сопрограмм (языковая есть в Си++20)
  • Сеть — не удалось сделать модульный подход
  • Контрактное программирование — уточнение условий на параметры функций
  • Некое pattern matching — возможно, описываемое в некоторых статьях гипотетическое ключевое слово inspect, аналог switch, действующий даже на разные объектные подтипы и разные шаблоны строк[94]

Комментарии

  1. 1 2 Здесь и далее «лёгкий/тяжёлый» — по системным ресурсам (процессорному коду, расходу памяти и т. д.), «простой/сложный» — по работе программиста, «простейший» — по функциональности.

Примечания

  1. Five Awesome C++ Papers for the H1 2023 — C++26, Varna and More — C++ Stories. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  2. 1 2 Trip report: Autumn ISO C++ standards meeting (Kona, HI, USA) – Sutter’s Mill. Дата обращения: 16 ноября 2023. Архивировано 16 ноября 2023 года.
  3. https://isocpp.org/files/papers/N4961.pdf
  4. Upcoming Meetings, Past Meetings : Standard C
  5. Источник. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  6. Disallow Binding a Returned Glvalue to a Temporary
  7. Erroneous behaviour for uninitialized reads
  8. Источник. Дата обращения: 29 ноября 2023. Архивировано 15 ноября 2023 года.
  9. Источник. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  10. Источник. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  11. Remove Deprecated strstreams From C++26
  12. std::wstring_convert - cppreference.com
  13. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2869r3.pdf
  14. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2875r3.pdf
  15. P2308R0: Template parameter initialization. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  16. Источник. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  17. https://isocpp.org/files/papers/P0609R3.pdf
  18. P2573R2: = delete("should have a reason")
  19. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  20. Источник. Дата обращения: 29 августа 2023. Архивировано 29 августа 2023 года.
  21. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  22. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  23. 1 2 Trip report: Summer ISO C++ standards meeting (Varna, Bulgaria) — Sutter’s Mill. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  24. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  25. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  26. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  27. P2752R2: Static storage for braced initializers. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  28. A new specification for std::generate_canonical. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  29. Clarifying rules for brace elision in aggregate initialization
  30. P3034R1: Module Declarations Shouldn’t be Macros
  31. P2809R3: Trivial infinite loops are not Undefined Behavior
  32. Add @, \$, and \` to the basic character set. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  33. N 2701: @ and $ in source and execution character set. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  34. 1 2 P2937R0: Freestanding: Remove strtok. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  35. Make assert() macro user friendly for C and C. Дата обращения: 17 ноября 2023. Архивировано 17 ноября 2023 года.
  36. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  37. Native handles and file streams. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  38. 1 2 3 Первые новинки C++26: итоги летней встречи ISO / Хабр. Дата обращения: 14 сентября 2023. Архивировано 5 сентября 2023 года.
  39. Debugging Support. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  40. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2013r5.html Архивная копия от 28 июля 2023 на Wayback Machine.
  41. P2338R4: Freestanding Library: Character primitives and the C library. Дата обращения: 8 августа 2023. Архивировано 10 августа 2023 года.
  42. P2407R5: Freestanding Library: Partial Classes. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  43. P2833R2: Freestanding Library: inout expected span. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  44. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  45. Checking if a union alternative is active. Дата обращения: 31 июля 2023. Архивировано 21 июля 2023 года.
  46. Источник. Дата обращения: 31 июля 2023. Архивировано 30 июля 2023 года.
  47. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  48. P2587R3: to_string or not to_string. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  49. Источник. Дата обращения: 31 июля 2023. Архивировано 21 июля 2023 года.
  50. Источник. Дата обращения: 31 июля 2023. Архивировано 21 июля 2023 года.
  51. P2591R4: Concatenation of strings and string views
  52. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  53. Type-checking format args. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  54. P2918R1: Runtime format strings II. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  55. P2905R1: Runtime format strings. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  56. P2909R4: Fix formatting of code units as integers
    (Dude, where’s my char?)
  57. P2845R6: Formatting of std::filesystem::path
  58. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3142r0.pdf
  59. P3107R3: Permit an efficient implementation of std::print
  60. Источник. Дата обращения: 31 июля 2023. Архивировано 21 июля 2023 года.
  61. function_ref: a type-erased callable reference — HackMD. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  62. Bind front and back to NTTP callables — HackMD. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  63. Member visit. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  64. P2592R3: Hashing support for std::chrono value classes. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  65. P1901R2 — Enabling the Use of weak_ptr as Keys in Unordered Associative Containers. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  66. P2363R5: Extending associative containers with the remaining heterogeneous overloads. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  67. Comparisons for reference_wrapper
  68. P2248R8: Enabling list-initialization for algorithms
  69. P2538R1: ADL-proof std::projected. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  70. Источник. Дата обращения: 14 ноября 2023. Архивировано 10 октября 2023 года.
  71. `std::basic_const_iterator` should follow its underlying type’s convertibility. Дата обращения: 14 ноября 2023. Архивировано 15 ноября 2023 года.
  72. `views::concat`
  73. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1068r10.pdf
  74. Submdspan. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  75. P2447R4: std::span over an initializer list. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  76. span.at() — HackMD. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  77. Padded mdspan layouts
  78. Better mdspan's CTAD
  79. https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p0493r5.pdf
  80. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  81. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  82. Источник. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  83. P0543R3: Saturation arithmetic. Дата обращения: 14 ноября 2023. Архивировано 14 ноября 2023 года.
  84. A free function linear algebra interface based on the BLAS. Дата обращения: 14 ноября 2023. Архивировано 5 ноября 2023 года.
  85. C++23 — финал, C++26 — начало / Хабр. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  86. inplace_vector. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  87. Introduction of std::hive to the standard library. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  88. Источник. Дата обращения: 31 июля 2023. Архивировано 21 июля 2023 года.
  89. C++ Concurrent Queues. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  90. Источник. Дата обращения: 31 июля 2023. Архивировано 24 сентября 2023 года.
  91. A Plan for C++23 Ranges. Дата обращения: 9 августа 2023. Архивировано 11 августа 2023 года.
  92. `std::constexpr_v`. Дата обращения: 31 июля 2023. Архивировано 31 июля 2023 года.
  93. To boldly suggest an overall plan for C++26. Дата обращения: 8 августа 2023. Архивировано 10 августа 2023 года.
  94. Источник. Дата обращения: 8 августа 2023. Архивировано 10 августа 2023 года.
Эта страница в последний раз была отредактирована 25 апреля 2024 в 18:48.
Как только страница обновилась в Википедии она обновляется в Вики 2.
Обычно почти сразу, изредка в течении часа.
Основа этой страницы находится в Википедии. Текст доступен по лицензии CC BY-SA 3.0 Unported License. Нетекстовые медиаданные доступны под собственными лицензиями. Wikipedia® — зарегистрированный товарный знак организации Wikimedia Foundation, Inc. WIKI 2 является независимой компанией и не аффилирована с Фондом Викимедиа (Wikimedia Foundation).