понедельник, 30 марта 2026 г.

[prog.c++] Говорят, что основная работа над C++26 завершена

Например, об этом написал Герб Саттер. Типа в C++ теперь есть и рефлексия, и контракты, и даже уменьшено число UB. Уж теперь-то точно заживем.

У меня, однако, отношение к данному событию весьма равнодушное.

Ну вот не отношусь к счастливчикам, которые пилят один проект для одной платформы на одном компиляторе. Посему не могу сидеть на самом свежем GCC (или clang-е, или MSVC) под самой-самой свежей ОС и наслаждаться плюшками самого свежего C++. До меня эти нововведения доходят спустя годы. Так что если смогу задействовать C++26 в продакшене году эдак в 2029-ом, то и хорошо.

Кроме того, в современный C++ завозят, вроде бы, крайне полезные вещи, но в таком виде, что оторопь берет.

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

Ну или взять контракты. В Eiffel-е -- это одна из самых классных фич языка, можно сказать киллер-фича. Тогда как в C++26 я что-то не вижу возможности использования old в постусловиях. Такое ощущение, что в C++ных контрактах мне не получится написать что-то вроде:

void push_back(T v) post(this->size() == old this->size() + 1)
{...}

Если я ошибаюсь, то буду признателен за подсказку о том, как такой фокус в C++ных контрактах осуществить.

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

2 комментария:

  1. мне кажется вы слишком требовательны..
    > Ну или взять контракты. В Eiffel-е -- это одна из самых классных фич языка, можно сказать киллер-фича. Тогда как в C++26 я что-то не вижу возможности использования old в постусловиях. Такое ощущение, что в C++ных контрактах мне не получится написать что-то вроде:

    Я неоднократно слышал о том что контракты добавляют в минимальной комплектации, а потом будут дорабатывать. Это неизбежно в такой системе стандартизации и с таким размером фичи.
    Могу ошибаться, но где-то видел предложения захватывать к контракты переменные как в лямбды. Что-то вроде `pre [size = this->size()] (this->size() == size + 1)`

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

    ОтветитьУдалить
    Ответы
    1. > Что-то вроде `pre [size = this->size()] (this->size() == size + 1)`

      Какой ужас... :(

      > А синтаксис рефлексии... какая разница вообще.

      Большая. Код нужно читать, а если при чтении приходится напрягаться чтобы рассмотреть [:и-что-то-еще-внутри:], то это будет утомлять сильнее, чем нужно.

      > Чтобы они не выбрали, всем не угодишь.

      Это да. Но когда недовольных всего 2%, то это лучше, чем когда таковых 20%.

      Касательно синтаксиса рефлексии вымораживает то, что нет нормального объяснения почему был выбран синтаксис ^^ и почему в обсуждении синтаксиса для [: :] было всего четыре не сильно отличающихся друг от друга вариантов (т.е. больше похоже, что это сравнение сделали "на отвали").

      > Важнее то что дает эта фича, а не то какие символы использует синтаксически.

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

      Т.е. плохой эргономикой можно ухудшить полезную фичу.

      > Кстати, какие у вас варианты?

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

      @T и [@ что-то-там @]

      или хотя бы

      ^^T и [^ что-то-там ^]

      Удалить