Pull to refresh
245
0
Antony Polukhin @antoshkka

Эксперт-разработчик C++

Send message

У того, что в стандарте закрепят byte == 8bit есть ещё неприятный момент для таких плформ. std::byte и char типы на этих платформах перестанут подпадать под стандарт, и начнутся проблемы с placement new и использовании std::byte в принципе :(

Есть https://wg21.link/P2758R3

Все шансы что тоже окажется в C++26

Думаю C++ ещё предстоит отказаться от явного constexpr в пользу автоматического его проставления. Но в ближайшее время это не произойдёт

А что бы вы предложили использовать вместо [: :] ?

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

Тут вопрос в переносимости фичи. С атрибутами хотят позволить работать, но это одно из самых различающихся мест в фронтенде имеющихся компиляторах. Поэтому выбор был между "рефлексией в C++26 без атриботов" и "рефлексией с атрибутами незивестно когда"

^^ выглядит ужасно. Символ ` (обратный апостроф) не используется в С++ могли бы его использовать.

На моём экране он практически не отличим от одинарной кавычки :(

class Foo::Bar; // когда это будет работать?

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

А если размер векторного регистра в compile time неизвестен (скажем, ARM SVE) - будет ли size() вычисляться динамически (и насколько хорошо в целом std::simd такое поддерживает) ?

Вот в RISC-V аналогичная ситуация. Там размер регистра получается вызовом рантайм команды. В текущей версии стандарта size() всегда известен на этапе компиляции

Можно ли с std::simd написать код без явного вспомогательного скалярного цикла, чтобы дать компилятору возможность этим воспользоваться?

Думаю да. Как минимум можно проинициализировать std::simd нулями, докопировать оставшуюся часть в simd переменную и выполнить команду. Маски тоже поддерживаются

Перепроверил по черновику предложения

  • `dealias(x)` отбрасывает все алиасы любой вложенности.

  • Трюк с получением имени через алиас на самом деле не сработает т.к. рекомендуется отбрасывать информацию об алиасах в `type_of`. Подправил статью

Обязательно продолжу писать о новинках :)

Комиты на модули в GCC идут еженедельно. Clang тоже неплохо уже модули поддерживает.

В MSVC\STL тоже всё хорошо. Видно что модули у них в высоком приоритете https://github.com/microsoft/STL/issues/4700 и видно что процесс движется https://github.com/microsoft/STL/issues/1694

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

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

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

  • оптимизатор - новые области видимости позволяют новые оптимизации

  • линкер (или его аналог) - участвует при формировании файла модуля

  • сборочные тулчейны - они должны автоматически обнаруживать зависимости исходников от модуля

  • препроцессор - нужен режим для тулчейнов, для обнаружения модулей (порой делается отдельной утилитой)

  • ABI - появляются сущности, "прикреплённые" к модулю

  • стандартная библиотека - большая работа по созданию модуля std и его тестированию (макросы больше не экспортируются, модуль должен нормально работать с include из стандартной библиотеки)

Умножьте всё это на 2 (модули же работают в двух режимах: import "header" и import module), а для MSVC умножьте ещё на 2 (IDE использует другой компиляторный фронтенд для подсветки синтаксиса и подсказок) :-(

В этом конкретном случае мне больше по душе транслитерация :)

Но при этом придётся подменять функцию освобождения памяти исключения. А в libc++ runtime это сделать нельзя, в одном месте эта функция заинлайнивается в самом libc++ runtime. Так что возможно что не получится

Отличный вариант! Сделаю так для Boost. 1.88

Спасибо!

Конечно коды возврата. Авторы Go и Rust могут только подтвердить

Python, C#, Java, JS и многие другие языки программирования с вами не согласятся. Да и в Rust паника - это исключение.

Статический анализ switch - хороший инструмент (есть нюансы с `default:`, и с большими кодовыми базами, с бинарными поставками). С исключениями же достаточно покрыть тестами catch блоки, которых будет значительно меньше чем проверок кодов возврата. И логика приложения не замусоривается лишними if err != nil и последующими обработками ошибок.

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

Исключение в тесте не ведёт к падению программы в большинстве тестовых фреймворков. А вот стектрейс от неожиданного исключения пришёлся бы кстати

Завозят в C++26. Как раз добавляют рефлексию времени компиляции

Отличная кстати идея! Но библиотека должна работать и в C++14, а там такого инструмента нет. А вот для новых стандартов я добавлю, спасибо!

Да, есть ограничения :(

Некоторые из них обходятся в Boost.PFR

Требуется C++20 стандарт с поддержкой auto в шаблонных параметрах

Information

Rating
Does not participate
Location
Россия
Works in
Registered
Activity