LINUX.ORG.RU

Герб Саттер — отчёт о встрече по стандартам ISO C++ в июне 2025 года

 ,


2

6

https://herbsutter.com/2025/06/21/trip-report-june-2025-iso-c-standards-meeting-sofia-bulgaria/

Уникальная веха: «Совершенно новый язык»

Сегодняшний день знаменует собой поворотный момент в развитии C++: несколько минут назад комитет C++ проголосовал за включение первых семи (7) документов по рефлексии во время компиляции в C++26 под несколько продолжительных аплодисментов в зале. Я думаю, что Хана «Мисс Constexpr» Дусикова лучше всего описала влияние этой функции несколько дней назад, в своей спокойной бесстрастной манере… Когда ей сказали, что документ об рефлексии попадёт на субботнее голосование по принятию, она слегка пожала плечами и тихо сказала: «Совершенно новый язык».

Микрофон упал.

До сегодняшнего дня, возможно, самым значимым опросом за всю историю C++ был опрос в Торонто в июле 2007 года о принятии первого документа «constexpr» Бьярне Струструпа и Габриэля Дос Рейса в проект C++11. Оглядываясь назад, мы можем видеть, какой тектонический сдвиг начался для C++.


Даниэль Лемир (Daniel Lemire) попробовал:


Экспериментальный форк clang от Bloomberg с поддержкой P2996 («Reflection for C++26»):

Есть в godbolt.org.

★★★★★

Последнее исправление: dataman (всего исправлений: 3)

Ребята героически, на протяжении десятилетий, реализуют куцый аналог макросов в лиспе?

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

аналог макросов в лиспе?

Напомни, макросы в лиспе гарантируют проверку типов и имён переменных на этапе компиляции или разработчик узнает об опечатке на проде?

LamerOk ★★★★★
()
Ответ на: комментарий от alysnix

а вам интересно так вот раскрашивать хидеры? :)

Мне интересно другое.

Суть не в конкретном способе раскраски, а в том, что сейчас станет возможным это делать. В принципе. До C++26 нельзя было от слова совсем, а станет можно. Вот в чем суть.

А вот вы этого упорно не понимаете. Почему? Дебилизм? Неприятие всего нового? Нежелание ломать устоявшиеся привычки?

eao197 ★★★★★
()
Ответ на: комментарий от alysnix

а где тут «интроспекция»?

Барри подразумевает, что такой код может генерироваться посредством интроспекции на базе ненавистной вам «раскраски в хэдерах». А благодаря параметру serializer затем формировать разное представление.

И при этом он говорит, что само по себе наличие интроспекции делает такой промежуточный шаг в C++ избыточным по сравнению с подходом, который используется в Rust-овом Serde.

ЗЫ. Вот уж точно: alysnix смотрит в книгу, а видит…

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Суть не в конкретном способе раскраски, а в том, что сейчас станет возможным это делать.

так и сейчас возможно понаставить мусорных деклараций в хидер, не понимая - зачем эти хидеры нужны, и усложнить жизнь клиенту модуля.

все уже в ваших руках! нет предела беспределу! А если вы думаете, что ставить в хидер мусор иного сорта, мусор высшей пробы, от интроспекции! - это вовсе другое, то это не так.

Это все мусор и не более. Все, что не нужно клиенту - мусор по определению. Такое определение у мусора в хидерах.

alysnix ★★★
()
Ответ на: комментарий от alysnix

так и сейчас возможно понаставить мусорных деклараций в хидер

Да что вы говорите?!

А давайте вы покажите как сейчас сделать аналог вот этого вот:

struct [[=derive<serde::Serialize>]] Person {
    [[=serde::rename("first name")]]
    std::string first;

    [[=serde::rename("middle name")]]
    [[=serde::skip_serializing_if(&std::string::empty)]]
    std::string middle = "";

    [[=serde::rename("last name")]]
    std::string last;
};

хотя бы на C++20. Код в студию.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

мусор в хидере это просто мусор. и никакие барри тут ничего не изменят. они могут только его убрать и передстать выглядеть ненормальными.

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

alysnix ★★★
()
Ответ на: комментарий от alysnix

хотя бы на C++20. Код в студию.

это мусорный код.

Т.е. показать как сделать аналог хотя бы вот этого хотя бы на C++20 вы не можете.

Ожидаемо.

А вы не только «малолетний дебил», вы еще и балабол, батенька.

eao197 ★★★★★
()
Ответ на: комментарий от dataman

Я уже четвертый или пятый день занимаюсь ловлей багов в алгоритме, который должен был быть простым, но почему-то таковым не оказался. А тут такая отдушина! :)))

Тем более, что хочется, чтобы у читателей LOR-а не сложилось впечатление, что г.alysnix не является типичным C++ником. Это настоящий уникум.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

А тут такая отдушина! :)))

5.4. Сообщения, неинтересные другим участникам обсуждения за исключением 2–3 человек, т. е. сугубо личная переписка, не содержащая полезной информации для других участников форума.

dataman ★★★★★
() автор топика
Ответ на: комментарий от dataman

Во что превращается LOR, на котором были флеймы на 10+ страниц, которые после 3-4 страницы велись 2-3 людьми… :(

;)

Хорошо, не буду больше. Постараюсь, по крайней мере.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Тут ключевое - "интересность другим".

Если б вместо тупняка были б аргументы, другое б было дело.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

В Лиспе же есть мега-крутая фича - замена кода прямо на ходу…

seiken ★★★★★
()
Ответ на: комментарий от unC0Rr

Со всеми старыми фичами и подводными камнями.

Не совсем. Фактически, это будут 2 разных языка: компайл-таймовый и рантаймовый. Рантаймовый - это который и до этого был. Он не изменится. Компайл-таймовый тоже, в какой-то мере, был и раньше, но вот он полностью преобразится.

anonmyous ★★
()
Ответ на: комментарий от Iron_Bug

с виду просто ещё один ненужный наворот. если он не будет портить производительность

Это компайл-таймовые фишки. Производительность компилятора просядет, а собранного кода - нет.

и его можно будет отключить

-std=c++23

anonmyous ★★
()
Ответ на: комментарий от LamerOk

Создание объекта в заведомо неопределённом состоянии

Объекта? Нет, объект конструктором создаётся. А вы тут говорите вовсе не про объект, а про простые типы. Да, в некоторых языках от простых типов отказываются, но плюсы ориентированы на зиро-оверхед семантику. И вам так и так дадут варнинг, если неинициализированная переменная была использована.

anonmyous ★★
()
Ответ на: комментарий от LamerOk

В тех редких случаях, когда нужно объявить объект T t[100500] без инициализации, можно ввести отдельный аттрибут типа __uninitialized.

В C3 так и сделано https://c3-lang.org/language-fundamentals/variables/#zero-init-by-default:

Unlike C, C3 local variables are zero-initialized by default. To avoid zero initialization, you need to explicitly opt-out.

int x;               // x = 0
int y @noinit;       // y is explicitly undefined and must be assigned before use.

AStruct foo;         // foo is implicitly zeroed
AStruct bar = {};    // bar is explicitly zeroed
AStruct baz @noinit; // baz is explicitly undefined

Using a variable that is explicitly undefined before will trap or be initialized to a specific value when compiling “safe” and is undefined behaviour in “fast” builds.

dataman ★★★★★
() автор топика
Ответ на: комментарий от anonmyous

Нет, объект конструктором создаётся. А вы тут говорите вовсе не про объект, а про простые типы.

При разговоре об изменениях в стандарте языка Си я использую терминологию из стандарта языка Си:

WG14/N850  J11/98-049
C9X RATIONALE

1.    Scope
2.    Normative References
3.    Terms and definitions

The definitions of object, bit, byte, and alignment reflect a strong consensus, reached after considerable
discussion, about the fundamental nature of the memory organization of a C environment:
• All objects in C must be representable as a contiguous sequence of bytes, each of which
is at least 8 bits wide.

Который, к слову, почти целиком входит в стандарт на С++.

Какую используешь ты - мне не ведомо.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Напомни, макросы в лиспе гарантируют проверку типов и имён переменных на этапе компиляции или разработчик узнает об опечатке на проде?

Именно в Лиcпе это не критично:

  1. Есть рестарты, т.е. ошибка тривиально правится на месте и код запускается как будто ее не было и в помине. («Быстро поднятое не считается упавшим»)
  2. Где вы последний раз видели Лисп в проде? :D
necromant ★★
()
Ответ на: комментарий от necromant
  1. Есть рестарты, т.е. ошибка тривиально правится на месте

То есть к каждому инстансу программы на лиспе надо приставить по лисперу в режиме 24х7.

  1. Где вы последний раз видели Лисп в проде?

Я думаю, это как-то связано с п. 1.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

То есть к каждому инстансу программы на лиспе надо приставить по лисперу в режиме 24х7.

У вас ошибки 24 на 7 валятся или только исключительно если:

  1. Не сработала методика защитного программирония
  2. Тесты не покрыли этот кейс
  3. CI/CD не отработал и на стейджинге не нашли проблему заблаговременно.

Так что можно и на 5 минут дернуть лиспера с пляжа, либо если есть доверия к нейросетям - дернуть ИИ-агента чтоб он пофиксил вам и не мешал бы вайбы ловить ))

Я думаю, это как-то связано с п. 1.

Я думаю это связано с Developers, Developers, Developers … в плане того, что толковых лисперов не найдешь, а если найдешь, то они будут спорить о множественном наследовании вместо того, чтобы CRUD-ить от заката до рассвета.

necromant ★★
()
Ответ на: комментарий от necromant

У вас ошибки 24 на 7 валятся

А какая разница, валяться они или нет? Лиспера-то приставленным всё равно держать надо.

Так что можно и на 5 минут дернуть лиспера с пляжа,

Если у него программа не работает, а он на пляже - то можно и не дёргать. Он всё равно уже уволен.

Не сработала методика защитного программирония

Покажешь программу на лиспе написанную с использованием этой техники?

Тесты не покрыли этот кейс

То есть, программа на лиспе не рабочая, пока мы не напишем 100% покрытие тестами на лиспе, которые тоже надо покрыть… wait, oh shi~

CI/CD не отработал

А каким образом CI вместе с CD (и пусть даже вместе с AC/DC) должны гарантировать отсутствие ошибок на проде? Какую работу должны сделать бедолаги? Особенно последний - за него мне прямо страшно.

толковых лисперов не найдешь, а если найдешь, то они будут спорить о множественном наследовании

За все годы существования лора и аномально большой популяции лоровских лисперов из какого-либо продемонстрированного кода я помню только чувака, написавшего сортировку бутылок, и лавсана.

Возможно, лисперы - и толковые, и бестолковые - просто уходят в параллельную вселенную, где они пишут лисп-программы для лисп-машины, но в этой вселенной их присутствие наблюдается только по археологическим артефактам.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Если у него программа не работает, а он на пляже - то можно и не дёргать. Он всё равно уже уволен.

Ну меня ж не уволили в своё время, только я был в кабине самолёта, а не на пляже :)

Тем более он может быть стейкхолдером вашего быстрорастущего стартапа. Попробуй убери такого. Помню раз всем отделом писали письма одного такого «сыночку» из ВИПов отодвинуть от разработки…

То есть, программа на лиспе не рабочая, пока мы не напишем 100% покрытие тестами на лиспе, которые тоже надо покрыть… wait, oh shi~

Вам тестов мало и жалко? ИИ кстати норм вполне так может и тесты навалять по-быстрому.

А каким образом CI вместе с CD (и пусть даже вместе с AC/DC) должны гарантировать отсутствие ошибок на проде? Какую работу должны сделать бедолаги? Особенно последний - за него мне прямо страшно.

Эти важные буквы исключают, что шаловливые ручки напрямую будут шуровать на серверах минуя линтеры, анализаторы и прочие технические приблуды, призванные обеспечивать непрерывную и качественную поставку ПО клиентам.

necromant ★★
()
Ответ на: комментарий от necromant

А каким образом CI вместе с CD (и пусть даже вместе с AC/DC) должны гарантировать отсутствие ошибок на проде?

Эти важные буквы исключают, что шаловливые ручки

То есть - никак. Ясно.

Ну меня ж не уволили в своё время,

То есть, ты писал программы на лиспе, они нихера не работали, но всем было настолько похер, что про тебя забыли? И я, кажется, знаю, почему:

дернуть ИИ-агента чтоб он пофиксил
ИИ кстати норм вполне так может и тесты навалять по-быстрому.

Дай угадаю - ТЗ вам поставил ИИ, и он же принимал работу.

Не сработала методика защитного программирония

Покажешь программу на лиспе написанную с использованием этой техники?

Жаль, что мы так и не услышали начальника транспортного цеха.

LamerOk ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

PDP-11, она же

И много ты заэмбедденой PDP-11 видел в момент создания языка Си?

LamerOk ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Глянь, что такое переменная в языке си и о чём мы разговариваем.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Ну меня ж не уволили в своё время,

То есть, ты писал программы на лиспе, они нихера не работали, но всем было настолько похер, что про тебя забыли?

Не я тогда на C++ писал без рефлексии, представляете? Смысла наказывать нету, я перед отлётом закрыл 15 из 20 тикетов, по остальным проконсультировал коллегу как решать. Норм ситуация.

Жаль, что мы так и не услышали начальника транспортного цеха.

потом как-нибудь, сейчас лениво всё, ещё и на Лиспе вам 🥱

necromant ★★
()
Ответ на: комментарий от necromant

потом как-нибудь,

Ну, то есть ты просто нащитпостил баззвордов без какой-либо связи с реальном миром, и надеялся, что никто не потянет тебя за язык? ;)

LamerOk ★★★★★
()
Ответ на: комментарий от eao197

Тем более, что хочется, чтобы у читателей LOR-а не сложилось впечатление, что г.alysnix не является типичным C++ником. Это настоящий уникум.

Это не крестовик, это человек с талантом лить воду и превращать темы в ничто.

Я его в игнор добавлял одно время, ибо утомил. Но когда он в игноре, то типичная картина на ЛОРе - на странице видно 3 сообщения, а 23 - не видно.

Думал, вдруг что-то интересное упускаю. Достал из игнора. Да нет, вода.

wandrien ★★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от alysnix

Через атрибуты как в Java.

Еще пример придумал, вот решил ты использовать сжатые указатели, вместо T* (uint64_t) теперь у тебя uint32_t к примеру.

typedef uint32_t CompressedPtr; 

class Cons 
{
  CompressedPtr car, cdr;
};

Как разыменовать указатель? Нужно ведь базу для смещения знать. Можно сделать сейчас вот такой удобный класс руками, а с помощью рефлексии можно будет его создать автоматически:

class ConsWrapper
{
  Cons *cons;
  Base *base;

  ConsWrapper(Cons *cons, Base *base)
    : cons{cons}, base{base} 
  {}

  ConsWrapper car()
  {
    Cons *cons_car = base->deref_compressed_ptr(cons->car);
    return ConsWrapper{cons_car, base};
  }

  ConsWrapper cdr()
  {
    Cons *cons_cdr = base->deref_compressed_ptr(cons->cdr);
    return ConsWrapper{cons_cdr, base};
  }

  void set_car(ConsWrapper new_car);
  void set_car(CompressedPtr new_car);
  void set_cdr(ConsWrapper new_cdr);
  void set_cdr(CompressedPtr new_cdr);
};

void main()
{
  ...
  auto x = ConsWrapper{cons, base};
  auto y = x.car().car().car();
}
Уже для Cons много писанины, а если структур много и полей тоже много?

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 5)
Ответ на: комментарий от MOPKOBKA

Там была возможность при декларации переменных объявлять, что они BASED в некой AREA, по сути - в частной куче. А потом всю эту кучу выгрузить в файл и загрузить из файла, например. Для обращения к данным внутри кучи использовался OFFSET, таким образом эти смещения не требовали себя менять при изменении адреса кучи.

Был ли смещения сжатыми, не знаю. Но учитывая, в каких древностях это работало, не исключено.

wandrien ★★★
()
Ответ на: комментарий от wandrien

Полезно, но такое в С++ можно выразить без рефлексии если кого то заинтересовало:

template <typename T>
class ptr_offset 
{
  T *base;
  size_t index;
public:
  ptr_offset(T *base, size_t index)
    : base{base}, index{index}
  {}
  
  T *operator -> ()
  {
    return base + index;
  }
};

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

Вроде не так, база должна отдельно храниться, то есть тип во время компиляции привязывается к тому, что «вон ту переменную считать базой для этого указателя».

wandrien ★★★
()
Ответ на: комментарий от wandrien

Если в сигнатуру типа входит привязка к переменной, это в какой системе типов такое выразить можно? И как такое будет называться? Не силён в матане^Wматчасти по этому поводу.

wandrien ★★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

Компилятор на -O2 устранит ненужное поле, и дополнительно всегда есть возможность вывести такую переменную за пределы области видимости.

Так что в ассемблерном коде получится все тоже самое.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 3)
Ответ на: комментарий от wandrien

Т.е. псевдокодом что-то наподобие:

void * base1 = ...;
void * base2 = ...;
MyPtr<&base1, int> ptr1 = ...;
MyPtr<&base2, int> ptr2 = ...;
ptr2 = ptr1; /* ошибка: несоответствие типов в операции присваивания. */
wandrien ★★★
()
Последнее исправление: wandrien (всего исправлений: 2)
Ответ на: комментарий от wandrien

С другой стороны, параметр шаблона в виде указателя на переменную базы вроде бы можно заменить типом без потери смысла, так что на крестах такой код тоже может быть выражен.

wandrien ★★★
()
Ответ на: комментарий от MOPKOBKA

Интересный язык всё-таки: стоит только какую-то неведомую хрень придумать в моменте, а для неё уже в крестах есть инструменты. Мощный язык.

Афинные и линейные типы туда еще не завезли вроде бы? Пора бы и это следом за рефлексией, чтобы растофанов корёжило.

Но писать и читать код всё-таки предпочитаю на более понятных для мозга языках. xD Мои познания остались где-то на уровне книжки Джеффа Элджера, в реальной практике я с актуальной версией крестов почти не сталкиваюсь.

wandrien ★★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.