Что нового в C++29: итоги июньской встречи в Брно
eoanermine 1 минуту назад Что нового в C++29: итоги июньской встречи в Брно Средний 4 мин 0 C++ * Обзор 13 июня закончилась встреча комитета по стандартизации C++ (также известного как WG21) в Брно (Чехия), на которой...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. eoanermine 1 минуту назад Что нового в C++29: итоги июньской встречи в Брно Средний 4 мин 0 C++ * Обзор 13 июня закончилась встреча комитета по стандартизации C++ (также известного как WG21) в Брно (Чехия), на которой комитет работал над будущим стандартом C++, C++29. В этой статье кратко пересказаны все принятые в него нововведения с примерами их использования и ссылками на оригинальные пропозалы для тех, кто захочет познакомиться с ними детально. P3596 В стандарте теперь будет перечень всего неопределенного (и заодно IFNDR) поведения.
Если раньше для того, чтобы найти все неопределенное поведение, приходилось грепать по всему документу слово «undefined», то теперь в стандарте будет целый раздел «Enumeration of Core Undefined Behavior» (если вы хотите изучить его уже сейчас — то его содержание приведено по ссылке выше на 60 странице). Приобщаться к прекрасному стало легче. P3097 В C++26 приняли контракты (и их даже уже реализовали в gcc 16), но с многими ограничениями, одно из которых заключалось в том, что их нельзя было использовать в виртуальных функциях.
Технические детали
Теперь можно:struct ; struct ; struct ; struct ; void t() { Z z; z. f(); // asserts g, h static_cast(&z)->foo(); // asserts e, g, h, f X1& x1ref = z; X2& x2ref = z; x1ref. f(); // asserts a, g, h, b x2ref.
f(); // asserts c, g, h, d x1ref. X1::f(); // asserts a, b void (X1::*pmf)() = &X1::f; (x1ref. *pmf)(); // asserts g, h }3.
P3668 Также в C++29 теперь можно не реализовывать постфиксный инкремент или декремент вручную, а реализовать только префиксный и определить постфиксный как =default, и компилятор сам его реализует. P2287 Ранее в C++20 из C99 притащили «Designated initializers» (существует ли общепринятый перевод на русский для этого словосочетания? ), но без возможности инициализировать с помощью них поля базовых классов (см.
Отраслевые последствия
пример ниже; он также доступен на godbolt), хотя, казалось бы? struct ; struct ; int main() { B ; // Работает в C++20 B ; // Не работает в C++20 B ; // Не работает в C++20 }В C++29 эту возможность решили добавить:struct ; struct ; B{{1}, 2} // корректно в C++20 // корректно в C++20 // теперь корректно в C++29 B{{. b=2} // теперь корректно в C++29 // теперь корректно в C++29 // по-прежнему некорректно5.
P3091 В некоторых случаях использовать operator у std::(unordered_)map дико неудобно, например код ниже не скомпилируется, если объект theMap объявлен как const:const std::map theMap = {... } double largest = -std::numeric_limits::infinity(); for (int i = 1; i <= 100; ++i) largest = std::max(largest, theMap);Без const код скомпилируется, но это может привести к нежелательному поведению, связанному с тем, что operator вставляет сконструированные по-умолчанию объекты, если они отсутствуют в контейнере.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





