C++23
C++23, на момент разработки C++2b — новый стандарт языка программирования C++. Из-за пандемии COVID все заседания комитета проходили полностью дистанционно (за исключением одного, частично дистанционного). Принят ISO с большим опозданием в октябре 2024[1]. Макрос Новый Hello worldС новыми изменениями библиотеки минимальная программа выглядит так[2] #include <print>
int main()
{
std::println("Hello, world!");
}
Запрещены и удаленыУдалены
Запрещены
Снят запрет
ЯзыкМелкие изменения
if constevalБолее раннее constexpr size_t strlen(char const* s) {
//if constexpr (std::is_constant_evaluated()) { Было, не вызывало ассемблерную версию
if consteval { // Стало
for (const char *p = s; ; ++p) {
if (*p == '\0') {
return static_cast<std::size_t>(p - s);
}
}
} else {
__asm__("Нечто оптимизированное на SSE или даже на AVX!");
}
}
Конечно, компиляторы выдают предупреждение, но неочевидно, что делать — правильно Вторая причина — взаимодействие между consteval int f(int i) { return i; }
constexpr int g(int i) {
// if (std::is_constant_evaluated()) { Было, не компилировалось
if consteval { // Стало
return f(i) + 1;
} else {
return 42;
}
}
Этот код вообще не компилировался, и хотелось бы сделать уголок в Фигурные скобки в then-части обязательны, в else- могут опускаться. Писать вроде Обратная форма выглядит как auto(x) — временная копия объектаПростой способ получить объект как временный, например[17]: void pop_front_alike(Container auto& x) {
std::erase(x.begin(), x.end(), auto(x.front()));
}
Нижеприведённый код корректен, но ревизор может соблазниться ошибочно убрать переменную auto a = x.front();
std::erase(x.begin(), x.end(), a);
В шаблонном программировании этот тип бывает получить непросто: using T = std::decay_t<decltype(x.front())>;
std::erase(x.begin(), x.end(), T(x.front()));
Название Также допустимо Многомерная операция индексирования (квадратные скобки)Существующие методы[18]: array(1, 2, 3, 4, 5) = 42; // выглядит ужасно, если вы не учили FORTRAN
array[{1, 2, 3, 4, 5}] = 42; // очень непонятно и неприятно писать
array[1][2][3][4][5] = 42; // чуть лучше, но под капотом творится просто жуть
Пока только для пользовательских типов[19]. int buffer[2*3*4] = { };
auto s = std::mdspan<int, std::extents<2, 3, 4>> (buffer);
s[1, 1, 1] = 42;
Разные библиотеки реализуют недостающий синтаксис по-разному, но в любом случае это не сочетается с синтаксисом стандартных массивов, и затрудняет автоматический поиск ошибок и inline (развёртывание функции прямо в вызывающий код). Предметом дискуссий остаются: нужно ли это для стандартных массивов; нужно ли ослабить требования к This-параметрыОдна из возможностей Си++ - const-корректность - приводит к дублированию кода или написанию способов делегирования. Предлагается решение этого через шаблоны[20] ///// БЫЛО /////
class TextBlock {
public:
char const& operator[](size_t position) const {
// ...
return text[position];
}
char& operator[](size_t position) {
return const_cast<char&>(
static_cast<TextBlock const&>
(this)[position]
);
}
// ...
};
///// СТАЛО /////
class TextBlock {
public:
template <typename Self>
auto& operator[](this Self&& self, size_t position) {
// ...
return self.text[position];
}
// ...
};
Методы-расширения пока не предлагаются, но будут возможны в дальнейшем. Другое назначение — повышение производительности при работе с классами минимального размера: даже если компилятор не умеет оптимизировать, будет происходить копирование, а не передача по ссылке. Снижение требований к constexprСделано множество послаблений: сигнатура не обязательно состоит из литеральных типов, подобъекты не обязательно конструируются/уничтожаются через constexpr, и т. д. Аргументация:
Таким образом, теперь возможно написать constexpr-функцию, которая ни при одном наборе аргументов не сможет выполниться при компиляции[21]. Должен ли компилятор в таком случае выдавать предупреждения — не указано. Также в constexpr-функциях разрешены goto, переменные нелитеральных типов, статические/внутрипоточные переменные. Если при компиляции будет пройдена любая из этих строк, функция вычисляется при выполнении[22]. В constexpr-функциях теперь могут участвовать указатели и ссылки с неизвестным значением, если их не разыменовывать — оказалось, что std::size не может работать со ссылками[23]: // Самодельный std::size для массивов, в STL G++ похожий код
template <typename T, size_t N>
constexpr size_t array_size(T (&)[N]) { return N; }
void check(int const (¶m)[3]) {
int local[] = {1, 2, 3};
constexpr auto s0 = array_size(local); // OK
constexpr auto s1 = array_size(param); // Теперь OK
}
Разрешены constexpr char xdigit(int n) {
static constexpr char digits[] = "0123456789abcdef";
return digits[n];
}
Это позволит, например, написать Лямбда-функции и Статические |
Название | Битов мантиссы/ порядка |
Диапазон | ulp(1.0) | Примечание |
---|---|---|---|---|
float16_t | 10+5 | 6.1e-5..65504 |
9.8e-4 |
Соответствует IEEE binary16 |
bfloat16_t | 7+8 | 1.2e-38..3.4e38 |
7.8e-3 |
Верхние два байта IEEE binary32 (≈float), используется в ИИ-библиотеках, отсюда имя — brain float. Современные ИИ-модели занимают гигабайты, но если такая погрешность влияет — модель определённо переобучена. |
float32_t | 23+8 | 1.2e-38..3.4e38 |
1.2e-7 |
Соответствует IEEE binary32, большинству реализаций float |
float64_t | 52+11 | 2.2e-308..1.7e308 |
2.2e-16 |
Соответствует IEEE binary64, большинству реализаций double |
float128_t | 112+15 | 3.4e-4932..1.1e4932 |
1.9e-34 |
Соответствует IEEE binary128 |
У всех этих типов неявная единица: целая часть мантиссы 1,xxx только подразумевается и не хранится.
Математические функции должны иметь обёртки для всех поддерживаемых типов — при этом реальный расчёт может вестись в более или менее точном типе[85].
Новая функциональность диапазонов (ranges) и представлений (views)
- Из концепции
view
удалена инициализация без параметров[86]. - Уточнены требования к дипазонам[87], представлениям[88], адаптерам диапазонов[89].
- Механизмы для написания собственных адаптеров диапазонов[90]
- Семейство адаптеров
zip
для параллельного прохождения разных диапазонов[91]. ranges::to
— преобразование из диапазона в контейнер[92].- Функции
iota
,shift_left
,shift_right
[93]. - Функции
chunk
иslide
[94]. - Функция
chunk_by
[95]. - Функция
join_with
[96].- Улучшена работа
join[_with]
с итераторами, которые возвращают ссылку на что-то внутри самого итератора[97].
- Улучшена работа
- Функции
starts_with
,ends_with
[98]. split_view
переименован вlazy_split_view
, добавлен новыйsplit_view
[99].- Ослаблены ограничения на
join_view
[100]. string_view
можно строить из непрерывного диапазона[101]. Впоследствии уточнили: конструктор явный (explicit)[102].- Механизмы вывода диапазонов функцией
format
[103]. - Добавлены механизмы указания, как печатать нестандартный диапазон функцией
format
— вывод запрещён, как отображение (map), как множество (set), как кортеж (sequence), как строку (string), как отладочное сообщение (debug_string).[104]. generator
— синхронный генератор диапазонов на сопрограммах[105]. Налажено форматирование подобных объектов[106]. Первое использование сопрограмм в стандартной библиотеке.single_view
и другие адаптеры-представления теперь могут работать с перемещаемыми, но не копируемыми типами[107].- Новая функция-адаптер
views::repeat
, повторяющая один объект N раз или до бесконечности[108]. - Переписаны требования к алгоритмам, чтобы они могли пользоваться итераторами диапазонов[109].
- Функция
cartesian_product
— декартово произведение диапазонов[110][111]. - Функция
ranges::fold
, представляющая собой f(f(…f(f(init, x1), x2), …), xn)[112]. - Функции
ranges::contains
,ranges::contains_subrange
[113]. - Объект
stride_view
, функцияviews::stride
— представление с шагом N[114] - Функции
ranges::find_last()
,find_last_if()
,find_last_if_not
[115]. - Функция
views::enumerate
[116] — часто функцией Си++ «проход по контейнеру» не пользовались просто потому, что вдобавок требовался номер в последовательности.
Новые подсказки по выведению параметров шаблона (deduction guides)
function
— теперь будет компилироватьсяstd::function f = less<int>{};
, если less — шаблон с новой статической операцией «вызов»[27].function
иpackaged_task
— теперь будет компилироватьсяstd::function g = F{};
, если F — объект, чья операция «вызов» содержит новый (также ожидаемый в Си++23) this-параметр[117]
Новая функциональность строк владеющих (string) и невладеющих (string_view)
string[_view].contains
— часто надо проверить на наличие подстроки, не выясняя, где совпадение[118].string.substr() &&
(с временнымthis
) — для оптимизацииauto a = someTemporaryString().substr(0, 2);
[119].- string_view можно строить из непрерывного диапазона (см. выше).
- Добавлен псевдоконструктор
string[_view](nullptr_t) = delete
— как подсказка: строить строку из пустого указателя запрещено.
string::resize_and_overwrite
Используется для экстремальной оптимизации на стыке строк и низкоуровневых API:
int compress(void* out, size_t* out_size, const void* in, size_t in_size);
std::string CompressWrapper(std::string_view input) {
std::string compressed;
compressed.resize_and_overwrite(input.size(), [input](char* buf, std::size_t n) noexcept {
std::size_t compressed_size = n;
auto is_ok = compress(buf, &compressed_size, input.data(), input.size());
assert(is_ok);
return compressed_size;
});
return compressed;
}
Возникнет вопрос: а что при этом соптимизировали по сравнению с двумя resize
?[18] Дело в том, что стоимость выделения памяти мало зависит от длины буфера, и в большинстве случаев на буфер будет выделено значительно больше памяти, чем реально потребуется на сжатую строку. Новая функция не инициализирует буфер, и ушло зануление очень длинного участка памяти — memset( compressed.data(), '\0', compressed.size())
.
Новая функциональность итераторов
- Адаптер
move_iterator
— теперь итератор того же вида (односторонний/двусторонний/произвольного доступа), что и исходный итератор (раньше только односторонний)[120]. - Переписаны требования к алгоритмам, чтобы они могли пользоваться итераторами диапазонов (см. выше).
cbegin
всегда должен возвращать константный итератор[121].- Исправлена
iterator_category
вcounted_iterator
и некоторых других, чтобы из них можно было собирать сложные диапазоны[122]. - Придумана концепция позаимствованных диапазонов — их итераторами можно продолжать пользоваться, когда объект-диапазон исчезает[123].
Новая функциональность контейнеров
- Конструкторы
stack/queue
, принимающие пару итераторов[124]. - Шаблонному конструктору
pair
даны типы по умолчанию[125]. - Разнородный
extract
иerase
в ассоциативных контейнерах[126]. Например, ключ храненияstring
, а ключ доступа —string_view
. - Переписыванием конструкторов сделано, чтобы аллокатор не участвовал в разрешении перегрузок[127].
- Новая функция
Allocator.allocate_at_least
, более полно использующая особенности механизма выделения памяти[128]. Контейнеры переменного размера понемногу будут переходить на неё. - Новые контейнеры
flat_[multi]set
иflat_[multi]map
, работающие как минимум на шаблонахvector
,deque
,list
. Представляют собой простые сортированные массивы.
Новые constexpr
- Больше
constexpr
вbitset
[129]. - Целочисленные
from_chars
,to_chars
[130]. - Почти все функции
unique_ptr
[131] — после того, какnew
иdelete
стали выполняться в этом контексте. - Математика из
cmath
,cstdlib
[132]. - Большинство функций
optional
,variant
[133]. type_info::op==
[134]
Новая функциональность format
Помимо стандартного форматирования новых объектов (описано в соответствующих разделах), там есть:
- Форматирование
thread::id
[76]. - Проверка корректности форматирования при компиляции, если такое возможно; облегчение
format_to
, если обработка при компиляции удастся[135]. - Открыт
format_string.get()
. Автоматическая проверка корректностиformat
при компиляции ограничивается функциейformat
, и пока обходной способ добавить проверку в свою функцию (например,log<Args...>(format_string, Args...)
— писать собственные реализацииformat_string
, пользуясь по максимуму штатными библиотеками[136]. Для последнего и нуженget
. Предполагается, что в новых версиях проверка будет сделана чище — например, через проверку параметров при компиляции.
Оптимизации и предупреждения
exchange
получил условный noexcept — если объект создаётся с перемещением и присваивается (с перемещением или по копии, в зависимости от правого параметра), не вызывая исключений[137].apply
получил такой же условный noexcept[138].- Некоторые библиотечные функции наподобие
malloc
иbit_cast
ещё с Си++20 получили прозвище «благословенные» — они могут неявно создавать объекты. То есть: не оперируя типом X, тем не менее, подразумевают, что в памяти может появиться объект типа X. Теперь можно «благословить» любую функцию кодомX* p = std::start_lifetime_as<X>(myMalloc(sizeof(struct X));
— и подобные вызовы не будут неопределённым поведением[139].- Типы, с которыми такие «благословенные» функции могут работать, названы «типы с неявным временем жизни» — для них придумана функция
std::is_implicit_lifetime
[140].
- Типы, с которыми такие «благословенные» функции могут работать, названы «типы с неявным временем жизни» — для них придумана функция
- Новые свойства типов
reference_constructs_from_temporary
,reference_converts_from_temporary
. Некоторые объекты (std::tuple<const std::string&>
) теперь не могут конструироваться из подобных объектов[141]. - Добавлен псевдоконструктор
string[_view](nullptr_t) = delete
— как подсказка: строить строку из пустого указателя запрещено.
Функция unreachable
Функция, указывающая, что при нормальной работе кода в данную точку попасть нельзя[142]. Поведение неопределённое, вызов этой функции в действующем коде — всегда нештатная ситуация.
enum class MyBool { NO, YES };
int toInt(MyBool x) {
switch (x) {
case MyBool::NO: return 0;
case MyBool::YES: return 1;
}
// Прикрываем знаменитое предупреждение G++
std::unreachable();
}
В большинстве компиляторов она «волшебная» (реализованная внутри компилятора), и в GCC/CLang много лет существовала под названием __builtin_unreachable
. Но даже без «волшебства» подходящая реализация простейшая: [[noreturn]]
с пустым телом.
Первоапрельские предложения
Предложение 1 апреля 2021 отсылало на My Little Pony, введя два ключевых слова «my» и «little», и объект «pony» — волшебный объект, делающий что угодно[143]. Кроме того, высмеивало программистский жаргон:
- Пони-ориентированное программирование, а также «Пони-объектно-ориентированное программирование» (POOP — «какашка») — всё новые и новые концепции программирования.
- В жаргоне групп Си++ появилось понятие «tony table» (таблица «было-стало») — непонятно, откуда, ведь автором первой из них был отнюдь не Тони. Предложение переименовало её в «pony stable».
- Последний раздел называется «Формулировка» — стандарт Си++ пишется таким канцеляритом, что там одно предложение: «Не говорите, что дочитали до этого места».
Оставлены на будущее
#embed
— загрузка массива из двоичного файла.- Ситуация с Юникодом в диагностических строках (
static_assert
и других). - Атрибуты для структурного связывания
auto [a, b [[vendor::attribute]], c] = f();
inspect
— более мощная версияswitch
.- Стековые сопрограммы (в Си++20 только с бесстековые).
- Проверка параметров функции при компиляции: чтобы проверить, что форматная строка и параметры
format
соответствуют друг другу, в Си++20 применяются сложные шаблоны. Поддержка со стороны языка упростила бы это.
Примечания
- ↑ ISO/IEC 14882:2024 - Programming languages — C . Дата обращения: 15 ноября 2024. Архивировано 6 октября 2021 года.
- ↑ std::println - cppreference.com . Дата обращения: 16 октября 2024. Архивировано 8 октября 2024 года.
- ↑ Источник . Дата обращения: 8 августа 2022. Архивировано 18 июля 2022 года.
- ↑ Источник . Дата обращения: 9 марта 2023. Архивировано 2 апреля 2023 года.
- ↑ P2652R2: Disallow User Specialization of allocator_traits . Дата обращения: 9 марта 2023. Архивировано 9 марта 2023 года.
- ↑ https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2327r1.pdf
- ↑ Core "NB" Issues . Дата обращения: 3 апреля 2023. Архивировано 2 апреля 2023 года.
- ↑ P2360R0: Extend init-statement to allow alias-declaration
- ↑ CWG Issue 2397
- ↑ P1102R2: Down with ()! Дата обращения: 9 августа 2022. Архивировано 9 августа 2022 года.
- ↑ Источник . Дата обращения: 27 июля 2022. Архивировано 24 мая 2022 года.
- ↑ Narrowing contextual conversions to bool . Дата обращения: 27 июля 2022. Архивировано 27 июля 2022 года.
- ↑ Change scope of lambda trailing-return-type . Дата обращения: 27 июля 2022. Архивировано 27 июля 2022 года.
- ↑ Источник . Дата обращения: 27 июля 2022. Архивировано 22 августа 2022 года.
- ↑ Источник . Дата обращения: 1 августа 2022. Архивировано 30 июля 2022 года.
- ↑ `if consteval` . Дата обращения: 20 июля 2022. Архивировано 20 июля 2022 года.
- ↑ auto(x): decay-copy in the language - HackMD . www.open-std.org. Дата обращения: 7 апреля 2023. Архивировано 7 апреля 2023 года.
- ↑ 1 2 C++23 — feature freeze близко / Хабр . Дата обращения: 28 июля 2022. Архивировано 14 мая 2022 года.
- ↑ Источник . Дата обращения: 20 июля 2022. Архивировано 24 мая 2022 года.
- ↑ Deducing this . Дата обращения: 27 июля 2022. Архивировано 12 июля 2022 года.
- ↑ Relaxing some constexpr restrictions . Дата обращения: 29 июля 2022. Архивировано 25 июля 2022 года.
- ↑ Non-literal variables (and labels and gotos) in constexpr functions . Дата обращения: 20 июля 2022. Архивировано 24 мая 2022 года.
- ↑ Using unknown pointers and references in constant expressions . Дата обращения: 7 ноября 2022. Архивировано 3 ноября 2022 года.
- ↑ Permitting static constexpr variables in constexpr functions . Дата обращения: 19 декабря 2022. Архивировано 19 декабря 2022 года.
- ↑ C++23 — финал, C++26 — начало / Хабр . Дата обращения: 8 марта 2023. Архивировано 8 марта 2023 года.
- ↑ consteval needs to propagate up
- ↑ 1 2 static operator() . Дата обращения: 29 июля 2022. Архивировано 29 июля 2022 года.
- ↑ Источник . Дата обращения: 19 декабря 2022. Архивировано 19 декабря 2022 года.
- ↑ Источник . Дата обращения: 6 ноября 2022. Архивировано 6 ноября 2022 года.
- ↑ P2468R2: The Equality Operator You Are Looking For . Дата обращения: 7 ноября 2022. Архивировано 7 ноября 2022 года.
- ↑ Allowing static_assert(false) . Дата обращения: 30 июня 2023. Архивировано 9 июня 2023 года.
- ↑ C++ Identifier Syntax using Unicode Standard Annex 31 . Дата обращения: 27 июля 2022. Архивировано 12 июля 2022 года.
- ↑ Источник . Дата обращения: 27 июля 2022. Архивировано 27 июля 2022 года.
- ↑ P2314R3: Character sets and encodings . Дата обращения: 27 июля 2022. Архивировано 24 мая 2022 года.
- ↑ https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2460r2.pdf
- ↑ https://isocpp.org/files/papers/P2295R6.pdf
- ↑ Источник . Дата обращения: 27 июля 2022. Архивировано 24 мая 2022 года.
- ↑ D2513R4: char8_t Compatibility and Portability Fix . Дата обращения: 19 декабря 2022. Архивировано 11 декабря 2022 года.
- ↑ Источник . Дата обращения: 29 июля 2022. Архивировано 24 мая 2022 года.
- ↑ Named universal character escapes . Дата обращения: 29 июля 2022. Архивировано 29 июля 2022 года.
- ↑ P2419R2: Clarify handling of encodings in localized formatting of chrono types . Дата обращения: 23 января 2023. Архивировано 23 января 2023 года.
- ↑ std::format() fill character allowances; proposed resolution for LWG issues 3576 and 3639 . Дата обращения: 14 апреля 2023. Архивировано 14 апреля 2023 года.
- ↑ Источник . Дата обращения: 27 июля 2022. Архивировано 24 мая 2022 года.
- ↑ Источник . Дата обращения: 27 июля 2022. Архивировано 24 мая 2022 года.
- ↑ P2201R1: Mixed string literal concatenation . Дата обращения: 27 июля 2022. Архивировано 27 июля 2022 года.
- ↑ Источник . Дата обращения: 27 июля 2022. Архивировано 30 июля 2022 года.
- ↑ P2266R3: Simpler implicit move . Дата обращения: 1 августа 2022. Архивировано 24 мая 2022 года.
- ↑ Cleaning up integer-class types . Дата обращения: 5 октября 2022. Архивировано 5 октября 2022 года.
- ↑ Источник . Дата обращения: 20 ноября 2022. Архивировано 1 декабря 2022 года.
- ↑ P2615R1: Meaningful exports
- ↑ Источник . Дата обращения: 21 марта 2023. Архивировано 15 марта 2023 года.
- ↑ D2718R0: Wording for P2644R1 Fix for Range-based for Loop . Дата обращения: 19 декабря 2022. Архивировано 19 декабря 2022 года.
- ↑ Источник . Дата обращения: 20 июля 2022. Архивировано 10 июня 2022 года.
- ↑ Источник . Дата обращения: 29 июля 2022. Архивировано 17 июня 2022 года.
- ↑ P0943R6: Support C atomics in C . Дата обращения: 8 августа 2022. Архивировано 8 августа 2022 года.
- ↑ Clarifying the status of the «C headers» . Дата обращения: 5 октября 2022. Архивировано 8 октября 2022 года.
- ↑ Support exclusive mode for fstreams . Дата обращения: 19 ноября 2022. Архивировано 30 ноября 2022 года.
- ↑ P1132R8: out_ptr - a scalable output pointer abstraction . Дата обращения: 1 мая 2023. Архивировано 4 мая 2023 года.
- ↑ C++ Weekly - Ep 374 - C++23's out_ptr and inout_ptr - YouTube . Дата обращения: 1 мая 2023. Архивировано 1 мая 2023 года.
- ↑ Источник . Дата обращения: 8 августа 2022. Архивировано 24 мая 2022 года.
- ↑ P1682R3: std::to_underlying for enumerations . Дата обращения: 8 августа 2022. Архивировано 8 августа 2022 года.
- ↑ P1272R4: Byteswapping for fun&&nuf . Дата обращения: 8 августа 2022. Архивировано 8 августа 2022 года.
- ↑ P1147R1: Printing `volatile` Pointers . Дата обращения: 5 октября 2022. Архивировано 8 октября 2022 года.
- ↑ Источник . Дата обращения: 19 ноября 2022. Архивировано 30 ноября 2022 года.
- ↑ Источник . Дата обращения: 19 ноября 2022. Архивировано 18 ноября 2022 года.
- ↑ Стандарт C++ 23 функционально завершен | Открытые системы. СУБД | Издательство «Открытые системы» . Дата обращения: 3 апреля 2023. Архивировано 7 апреля 2023 года.
- ↑ Источник . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ Источник . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ MDSPAN . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ Inheriting from `std::variant` . Дата обращения: 21 ноября 2022. Архивировано 21 ноября 2022 года.
- ↑ `common_reference_t` of `reference_wrapper` Should Be a Reference Type . Дата обращения: 9 марта 2023. Архивировано 9 марта 2023 года.
- ↑ [1]Архивная копия от 4 мая 2023 на Wayback Machine P1642R11: Freestanding Library: Easy [utilities], [ranges], and [iterators]
- ↑ invoke_r - HackMD . Дата обращения: 22 ноября 2023. Архивировано 22 ноября 2023 года.
- ↑ P2212R2: Relax Requirements for time_point::clock . Дата обращения: 22 ноября 2023. Архивировано 22 ноября 2023 года.
- ↑ A Proposal to add stacktrace library . Дата обращения: 21 ноября 2022. Архивировано 21 ноября 2022 года.
- ↑ 1 2 Источник . Дата обращения: 9 марта 2023. Архивировано 8 марта 2023 года.
- ↑ C++ Weekly — Ep 349 — C++23’s move_only_function — YouTube . Дата обращения: 7 ноября 2022. Архивировано 7 ноября 2022 года.
- ↑ P0288R9: move_only_function . Дата обращения: 20 июля 2022. Архивировано 20 июля 2022 года.
- ↑ barrier’s phase completion guarantees - HackMD . Дата обращения: 9 марта 2023. Архивировано 9 марта 2023 года.
- ↑ P0323R12: std::expected . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ p0798R6: Monadic operations for std::optional . Дата обращения: 20 июля 2022. Архивировано 20 июля 2022 года.
- ↑ P2505R5 Monadic Functions for
std::expected
. Дата обращения: 19 ноября 2022. Архивировано 17 ноября 2022 года. - ↑ P2093R14: Formatted output . Дата обращения: 29 июля 2022. Архивировано 24 июля 2022 года.
- ↑ P2539R3: Should the output of std::print to a terminal be synchronized with the underlying stream? Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ P1467R9: Extended floating-point types and standard names . Дата обращения: 29 июля 2022. Архивировано 29 июля 2022 года.
- ↑ Views should not be required to be default constructible . Дата обращения: 13 ноября 2022. Архивировано 13 ноября 2022 года.
- ↑ Poison Pills are Too Toxic . Дата обращения: 19 ноября 2022. Архивировано 7 апреля 2023 года.
- ↑ What is a `view`? Дата обращения: 13 ноября 2022. Архивировано 13 ноября 2022 года.
- ↑ Clarifying range adaptor objects . Дата обращения: 21 ноября 2022. Архивировано 21 ноября 2022 года.
- ↑ Pipe support for user-defined range adaptors . Дата обращения: 13 ноября 2022. Архивировано 13 ноября 2022 года.
- ↑ zip . Дата обращения: 13 ноября 2022. Архивировано 13 ноября 2022 года.
- ↑ Источник . Дата обращения: 13 ноября 2022. Архивировано 10 декабря 2022 года.
- ↑ ranges::iota, ranges::shift_left, and ranges::shift_right . Дата обращения: 13 ноября 2022. Архивировано 13 ноября 2022 года.
- ↑ Windowing range adaptors: views::chunk and views::slide . Дата обращения: 13 ноября 2022. Архивировано 13 ноября 2022 года.
- ↑ views::chunk_by . Дата обращения: 13 ноября 2022. Архивировано 13 ноября 2022 года.
- ↑ views::join_with . Дата обращения: 13 ноября 2022. Архивировано 1 декабря 2022 года.
- ↑ Stashing stashing iterators for proper flattening . Дата обращения: 9 марта 2023. Архивировано 9 марта 2023 года.
- ↑ starts\_with and ends\_with . Дата обращения: 13 ноября 2022. Архивировано 13 ноября 2022 года.
- ↑ Superior String Splitting . Дата обращения: 13 ноября 2022. Архивировано 13 ноября 2022 года.
- ↑ join_view should join all views of ranges . Дата обращения: 13 ноября 2022. Архивировано 13 ноября 2022 года.
- ↑ Источник . Дата обращения: 13 ноября 2022. Архивировано 5 октября 2022 года.
- ↑ `string_view` range constructor should be `explicit&grave . Дата обращения: 19 ноября 2022. Архивировано 9 декабря 2022 года.
- ↑ Formatting Ranges . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ Improve default container formatting . Дата обращения: 19 ноября 2022. Архивировано 30 ноября 2022 года.
- ↑ Источник . Дата обращения: 19 ноября 2022. Архивировано 30 ноября 2022 года.
- ↑ P2418R2: Add support for
std::generator
-like types tostd::format
. Дата обращения: 21 ноября 2022. Архивировано 21 ноября 2022 года. - ↑ P2494R2: Relaxing range adaptors to allow for move only types . Дата обращения: 19 ноября 2022. Архивировано 30 ноября 2022 года.
- ↑ P2474R2: `views::repeat` . Дата обращения: 19 ноября 2022. Архивировано 30 ноября 2022 года.
- ↑ P2408R5: Ranges iterators as inputs to non-Ranges algorithms . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ P2374R4: `views::cartesian_product` . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ Empty Product for certain Views . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ ranges::fold . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ `std::ranges::contains` . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ stride_view . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ Источник . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ Источник . Дата обращения: 9 марта 2023. Архивировано 8 марта 2023 года.
- ↑ Issue 3617: function/packaged_task deduction guides and deducing this . Дата обращения: 19 ноября 2022. Архивировано 1 декабря 2022 года.
- ↑ string contains function . Дата обращения: 8 августа 2022. Архивировано 8 августа 2022 года.
- ↑ std::string::substr() && . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ move_iterator<T*> should be a random access iterator . Дата обращения: 19 ноября 2022. Архивировано 27 ноября 2022 года.
- ↑ cbegin should always return a constant iterator . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ Repairing input range adaptors and counted_iterator . Дата обращения: 21 ноября 2022. Архивировано 21 ноября 2022 года.
- ↑ Conditionally borrowed ranges . Дата обращения: 21 ноября 2022. Архивировано 21 ноября 2022 года.
- ↑ Источник . Дата обращения: 22 ноября 2023. Архивировано 1 октября 2023 года.
- ↑ Default Arguments for pair's Forwarding Constructor . Дата обращения: 22 ноября 2023. Архивировано 1 ноября 2023 года.
- ↑ P2077R3: Heterogeneous erasure overloads for associative containers . Дата обращения: 29 июля 2022. Архивировано 24 мая 2022 года.
- ↑ P1518R2: Stop overconstraining allocators in container deduction guides . Дата обращения: 22 ноября 2023. Архивировано 16 января 2024 года.
- ↑ P0401R6: Providing size feedback in the Allocator interface . Дата обращения: 8 августа 2022. Архивировано 20 июля 2022 года.
- ↑ Источник . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ Источник . Дата обращения: 20 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ Источник . Дата обращения: 20 ноября 2022. Архивировано 5 октября 2022 года.
- ↑ Источник . Дата обращения: 20 ноября 2022. Архивировано 30 ноября 2022 года.
- ↑ Missing `constexpr` in `std::optional` and `std::variant` . Дата обращения: 21 ноября 2022. Архивировано 21 ноября 2022 года.
- ↑ Making std::type_info::operator== constexpr . Дата обращения: 22 ноября 2023. Архивировано 22 ноября 2023 года.
- ↑ P2216R3: std::format improvements . Дата обращения: 21 ноября 2022. Архивировано 22 октября 2022 года.
- ↑ Expose std::$basic-format-string$<charT, Args...> . Дата обращения: 19 ноября 2022. Архивировано 27 ноября 2022 года.
- ↑ P2401R0: Add a conditional noexcept specification to std::exchange . Дата обращения: 28 июля 2022. Архивировано 28 июля 2022 года.
- ↑ Add a conditional noexcept specification to std::apply . Дата обращения: 19 ноября 2022. Архивировано 20 ноября 2022 года.
- ↑ Источник . Дата обращения: 19 ноября 2022. Архивировано 9 декабря 2022 года.
- ↑ Источник . Дата обращения: 9 марта 2023. Архивировано 9 марта 2023 года.
- ↑ A type trait to detect reference binding to temporary . Дата обращения: 20 ноября 2022. Архивировано 5 декабря 2022 года.
- ↑ Источник . Дата обращения: 20 ноября 2022. Архивировано 1 декабря 2022 года.
- ↑ std::pony . Дата обращения: 23 августа 2024. Архивировано 23 августа 2024 года.