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)
Ответ на: комментарий от ya-betmen

кому теперь хана

Хрен их знает, но мне тоже пофиг.

no-such-file ★★★★★
()

Совершенно новый язык

И как же всем пофиг.

vtVitus ★★★★★
()

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

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

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

Плохо что ли? Хорошо же! Сейчас ещё новых напихают и язык окончательно отомрёт.

Живые наступают!

Джва года ждал! Жаль, мой копи-паст нагенеренный Perl TemplateToolkit для запросов к SQLite из 2013 года этого уже не увидит…

necromant ★★
()

Ещё один язык в C++ со странным синтаксисом. Хотя бы на D посмотрели что ли :(

import std.traits : FieldNameTuple;
import std.stdio;
import std.conv : to;

struct Foo
{
    int i;
    double d;
    char c;
}

void main()
{
    Foo obj = { 1, 3.14 , 'a'};

    foreach (fieldName; FieldNameTuple!Foo)
    {
        writeln(fieldName);
    }

    foreach (value; obj.tupleof)
    {
        writeln(value);
    }
}
IceRain
()
Последнее исправление: IceRain (всего исправлений: 2)
Ответ на: комментарий от IceRain

Как будто песок в глаз попал, возникло непреодолимое желание поменять местами double d и int i в struct Foo

Obezyan
()
Ответ на: комментарий от ya-betmen

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

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

не только со старыми недоделанными но еще и новыми !!11
возрадуйся человече, два комплекта в одной корзинке.

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

А они должны быть инициированы?

Инициализированы.

Чем

Нулём.

и почему?

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

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

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

столько грантов можно распилить, а ты о какой-то муре +). Ты б ещё о стандартной библиотека с поддержкой utf заикнулся или там об репозитории библиотек с поиском и скачкой или об стандартной системе сборки. Не до того чувакам у них новый язык, поэтому велосипеды, бесконечный парад разных убогих сборок и близкий к нолю процент использования языка в новых проектах.

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

Нулём.

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

Переменная может быть определена внутри тела цикла и такая ее «инициализация на всякий случай» может быть слишком накладной.

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

Зачем, если ниже по коду туда запишут не ноль?

Если компилятор может определить, что точно запишут, то он уберет эту инициализацию.

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

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

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

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

А они должны быть инициированы?

Инициализированы.

Чем

Нулём.

Господин, наверное, не знает, что С++ иногда таки используют для embedded. И в C фича «объявил переменную, а она не инициализирована» появилась по той же причине. Потому что объявил ты, что, например в сегменте «Vectors» у тебя будет переменная REGIST_PPU_2000_RESET и если ты ее инициализировал - то это будет означать, что у тебя скрытно в этот регистр устройства, смапленный на ROM полетит 0. Что, например, закроет задвижку.

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

то есть получается что инициализация по дефолту - бестолковая и даже опасная штука

Именно так, должна быть ошибка как в санитайзерах. Какой нибудь int по логике программы вообще может иметь только валидный диапазон 100 ... 500.

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

Потому что объявил ты, что, например в сегменте «Vectors» у тебя будет переменная REGIST_PPU_2000_RESET и если ты ее инициализировал - то это будет означать, что у тебя скрытно в этот регистр устройства, смапленный на ROM полетит 0. Что, например, закроет задвижку.

Можно сделать исключене для volatile.

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

Ага, то есть усложнение на ровном месте. На int x инициализируем, на volatile int x нет. А с register как? А аттрибуты?

int x __attribute__((section(".dma")))

А weak? Будет два раза инициализирован? Компилятор же не знает про второе место объявления когда компилирует один объектник. Значит код инициализации будет в init секции каждого объектника.

А как эта вся хня будет биться с __attribute__((noload)), который «аллоцируй мне место под переменную, но ни в коем случае не трогай содержимое»?

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

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

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

а вот если дефолтной инициализации нет - то будет ошибка и ее нужно рапортовать.

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

а вот если дефолтной инициализации нет - то будет ошибка и ее нужно рапортовать.

Опять же, в embedded - не всегда будет.

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

При чтении переменной в которую ничего не было записанно.

если по стандарту туда пишется ноль по умолчанию… то чтобы прочитать оттуда ноль… мне надо опять записать туда ноль???

чота вы там перемудрили.

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

используют для embedded. И в C фича «объявил переменную, а она не инициализирована» появилась по той же причине.

Напомни, это PDP-7 или PDP-11 у нас embedded?

например в сегменте «Vectors» у тебя будет переменная REGIST_PPU_2000_RESET и если ты ее инициализировал

Ну так засунь её в неинициализированный сегмент экзешника.

Но самое главное, "господин", - научись различать частные случаи и общие.

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

-Wuninitialized + Werror же.

Всё бы ничего, да -Wunused-but-set-variable, и куда крестьянину податься?

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

Какой нибудь int по логике программы вообще может иметь только валидный диапазон

Самое смешное - что это обратно-совместимое изменение, не нарушающее текущего стандарта. Неинициализированная переменная может точно так же содержать ноль как и любое другое значение.

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

А если там в конструкторе сайдэффект?

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

Ты что то не так понял, я предлагаю -Wuninitialized сделать ошибкой.

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

Ну так засунь её в неинициализированный сегмент экзешника.

Шта? Вы вообще понимаете смысл слов «сегмент», «отображение регистров в память», «память с отображением на устройства»?

Короче в ембеддед вы не ходили, поэтому не понимаете как это работает.

PPP328 ★★★★★
()

Круто.

Пример выглядит жутковато, впрочем, это типично для крестов.

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

Вы вообще понимаете смысл слов «сегмент»,

Ну, раскрой интригу. Чем

сегмент «Vectors» c переменной REGIST_PPU_2000_RESET

принципиально отличается от любого другого ELF / COFF сегмента в файле на диске ?

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

Ты знаешь, когда я отборол на запрете инициализации несколько процентов в CV алгоритме, который молотит на слабом железе, то я с теплом вспомнил создателей C++.

hatred ★★★
()

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

А для чего еще оно надо, кроме сериализации, каких-то отладочных рефлексий?

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

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

в дополнение с себе самому.

они там в своих комитетах ни разу не сталкивались с проблемой, когда в сериализации меняется имя поля(читай ключ записи), отчего данные становятся невалидными и больше не грузятся? А теперь представим, что этих данных припасено за годы.

Это ж.па почище других ж.п, особенно когда это поздно замечено. Когда возникают нужные данные, но с разным форматом. Тогда остается только конвертеры писать. Ну или делать мульформатную загрузку, но тут уже надо выкидывать рефлексию, ручками вытаскивать нужные поля с правильных тегов, проклиная рефлексию и тех, кто это придумал.

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

https://pydong.org/posts/KwArgs/

Fun with C++26 reflection - Keyword Arguments

#include <print>

#define KWARGS_FORMATTING 1
#include <kwargs.h>

template <typename T>
int test(int x, erl::kwargs_t<T> args){
  return x * get<"y">(args, 42);
}

int main(){
  std::println("test({}, {}) -> {}", 7, "y=42",
               test(7, make_args(y=23)));
  std::println("test({}, {}) -> {}", 7, "z=42",
               test(7, make_args(z=23)));

  // optional wrappers around `std::format`, `std::println` 
  // and `std::format`
  int y = 3;
  erl::println("foo: {foo} bar: {bar}", 
               make_args(bar=3, 
                         foo=test(7, make_args(y))));
}
dataman ★★★★★
() автор топика
Ответ на: комментарий от LamerOk

Вы только одно слово прочитали? Сейменты часто мапятся с отображением на устройство (термин, который вы скипнули). Тот же VECTORS часто таблица указателей на коллбеки, которые будут вызваны по прерываниям, например NMI/IRQ. Кроме того существуют сегменты для отображения на устройство с предоставлением управления/опроса регистра устройств. Любое значение переменной, которое там будет записано изменит состояние устройства. Я и говорю, что раз у вас такие вопросы - то embedded вы не писали

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

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

Не имеем, если система сериализации будет поддерживать кастомные аннотации. https://brevzin.github.io/c++/2024/09/30/annotations/

А для чего еще оно надо, кроме сериализации, каких-то отладочных рефлексий?

Например: https://brevzin.github.io/c++/2025/05/02/soa/

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

Иногда лучше жевать…

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

Не имеем, если система сериализации будет…

что значит это сочетание - «если будет»? а если не будет? а сколько шансов на то, что будет?

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

их мнение вообще-то носит частный характер, а мы тут не диссертации пишем. давайте кратко, по-взрослому, без воды на 20 страниц - зачем оно вам надо?

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

кстати предлагаю банить за закидывание ссылками(ссылочный спам), без внятного разъяснения - о чем там вообще речь.

Может ее и открывать не стоит. Или она вообще не относится к обсуждаемой теме. Или у автора тараканы в голове, и он сам потерялся, и «вошел не в ту дверь» со своими сылками. И вот все будут ее открывать, разбираться что к чему, терять время.

Согласны?

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

Вы только одно слово прочитали?

Нет, я прочитал полностью оба сообщения. И ни в одном не увидел ответа на свой вопрос.

Тот же VECTORS часто таблица указателей на коллбеки

Я запутался. VECTORS должен или не должен быть инициализирован? Или и то, и другое и можно без хлеба?

Сейменты часто мапятся

Да и ради бога. Мой вопрос заключался в следующем:

Чем эти сегменты принципиально отличается от любых других сегментов в ELF / COFF файлах на диске ?

На всякий случай, попробую перевести вопрос с более общей корректной формулировки на более тупую и для даунов - чем VECTORS принципиально отличается от .bss / vdso?

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

что значит это сочетание - «если будет»?

Если будет, то не имеем.

а если не будет?

То имеем.

а сколько шансов на то, что будет?

Зависит от вменяемости и опытности того, кто делает. А так же от требований. Для каких-то применений это не нужно от слова совсем.

не могли бы вы объяснить своими словами, если таковые имеются - зачем вам реально нужна интроспекция

Во-первых, чтобы было. Вот есть множественное наследование в C++. Практически никогда не надо. Но когда надо, то хорошо, что оно есть. Подозреваю, что интроспекция будет востребована чуть чаще, чем множественное наследование.

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

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

зачем оно вам надо?

Чтобы не жить вместе с такими как вы в каменном веке.

кстати предлагаю банить за закидывание ссылками(ссылочный спам), без внятного разъяснения - о чем там вообще речь.

Я бы предложил банить за тупость и нежелание учиться. Но тогда вы и еще половина LOR-а перешли бы в режим «только чтение».

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

Если будет, то не имеем.

Понятно. «если бы у бабушки была борода, она бы была дедушкой.» Вы реально считаете это аргументом в данной дискуссии?

Во-первых, чтобы было. Вот есть множественное наследование в C++. Практически никогда не надо.

вы как долго в с++??? Это надо ВСЕГДА, когда реализуются подобия явских «интерфейсов», или рустовых «трейтов». В С++ для этого есть общий механизм, называемый наследованием. А в яве для этого два механизма - наследование и реализация.

Чтобы не жить вместе с такими как вы в каменном веке.

не бойтесь. вы всегда будете жить в веке деревянном.

Я бы предложил банить за тупость и нежелание учиться.

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

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

Ну мне жаль, если вы не понимаете, что при экзешнике в ОС у вас сегменты нужны ld, а на железе они настолько низко «проваливаются», что мапятся на входы/выходы железки.

В vectors когда железка создаст прерывание (которое полностью гробит текущее выполнение кода) она возьмет переменную, что написана по адресу и сделает indirect jump по этому адресу, скинув в стек адрес возврата

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

Вы реально считаете это аргументом в данной дискуссии?

Ссылки на конкретные рассказы о том, как делать кастомные атрибуты, пригодные, в том числе и для сериализации с учетом переименования полей – да. Это как раз аргументы, в отличии от ыкспертного мнения «Карочи, если в проде такой код будет - это серьезный вопрос о качестве этого прода.»

вы как долго в с++???

С конца 1991-го, если мне не изменяет склероз.

Это надо ВСЕГДА, когда реализуются подобия явских «интерфейсов», или рустовых «трейтов».

Только вот множественное наследование от абстрактных классов, в которых нет собственных данных – это не фокус. Тогда как настоящее множественное наследование от классов с данными внутри, вот это штука редкая.

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

Я так понимаю, что вы ссылки, которые я вам давал, вы проигнорировали и примеры вас, по факту, не интересуют?

Ну тогда незачем тратить время на политес и можно прямо назвать малолетнего дебила «малолетним дебилом» (с) без оглядки на биологический возраст.

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

С конца 1991-го, если мне не изменяет склероз.

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

Только вот множественное наследование от абстрактных классов, в которых нет собственных данных – это не фокус. Тогда как настоящее множественное наследование от классов с данными внутри, вот это штука редкая

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

Я так понимаю, что вы ссылки, которые я вам давал, вы проигнорировали и примеры вас, по факту, не интересуют?

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

Если вы сами не поняли, про что там - зачем даете ссылку?, если поняли - опять зачем ссылка, говорите своими словами.

Во-вторых, есть подозрение, что вот такие вот задачки,

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

По крайней мере, навскидку, в вашем кодике видно переувлечение руководствами по с++, всякой требухой из std, и особенно внушают нотации вида «m_member», и не дай бог вам дадут рефлексию без алиасов - и все ваши «m_» улетят в сериализацию. И вообще - вас куда-то заносит в простейших случаях.

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