Стандартную библиотеку C++ (и скорее всего C) разметят этими атрибутами и не erroneous поведение (как в случае с std::cin) не будет приводить к предупреждениям.
Авторы предложения на линал хотели добавить операторы, но столкнулись с целой кучей проблем https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1673r13.html#arithmetic-operators-and-associated-expression-templates
В чачтности некоторые операторы не однозначны (например умножение может значить разное); некоторые операторы предполагают аллоцирование, что не ложится на парадигму невладения и убирает возможность указать другой результирующий тип и т.п.
Операторы возможно добавят позднее, а пока что - низкоуровневый интерфейс, на основе которого можно эффективно строить более высокоуровневые интерфейсы
Она там тоже не бесплатная, просто накладные расходы в отдельном потоке (*есть нюансы). К тому же, практически во всех языках с GC тоже есть способ получить память быстрее, без зануления. Просто эти техники бадьше спрятаны, чтобы ими не воспользовались случайно
Изначально не добавляли индексирование, чтобы мотивировать разработчиков писать более эффективный для времени компиляции код, где variadic pack распаковвывается в одну операцию.
Со временем, пришло понимание что для ряда задач это крайне не удобно и не улучшает ни читаемость кода, ни времена компиляции. При этом, после добавления новых способов работать с паком, там где можно распаковвть всё в одну операцию и так делают в одну операцию.
Все операции работают над std::mdspan. В примере std::vector для того, чтобы показать как std::mdspan создать над массивом данных.
Да, std::mdspan не владеющий класс. Посмотрите примеры в proposal, часто нужны операции над частью матрицы и соответственно на практике нужен именно не владеющий класс
Точно так же - значение 65535 в такой интерпретации не является валидным для ushort_16.
В случае арифметики насыщения, краевые значения (0 и 65535) не надо воспринимать как не валидные. Это просто значения
Пример задачи где такая арифметика хорошо подходит: наполнение резервуара. Есть резервуар на 65535 единиц. Чтобы вылить из него `x`, надо позвать res = std::sub_sat<unsigned short>(res, x), чтобы долить `y` надо позвать res= std::add_sat<unsigned short>(res, y)
С такими операциями насыщения у вас резервуар не будет содержать больше чем он вмещает, а при заполнении нет риска что резервуар случайно "опустеет" из-за переполнения.
`auto i = {42};` уже превратили в ошибку компиляции, разрешили инициализацию агрегатов через круглые скобки, инициализацию атомиков тоже поправили, assert вот тоже поправили (об этом есть в посте).
Многие другие ужасы уже давно были поправлены, как и говорится в выступлении.
Ну и автор доклада активно участвует в комитете. Большинство подобных правок для упрощения базовых вещей языка - его заслуга
Она должна быть на очень хорошем уровне, на уровне BLAS/LAPACK. Авторы предложения заморачивались с тем, чтобы линал был бинарно совместим с эталонными реализациями BLAS/LAPACK. И соответственно, чтобы можно было использовать эталонные реализации напрямую в имплементации стандартных библиотек.
В некоторых странах "лоббирование" является легальным промыслом. И не смотря на все лоббирования на уровне одного гос. учреждения X в шататх, другое гос. учреждение Y в тех же штатах запрещает использовать рекомендуемые X "надёжные" языки в любых жизненно важных проектах.
Пара хранится в map, но она хранится с константным first. Поэтому *d_map.begin() вернёт `const std::pair<const std::string, int>&`, от которого создастся временный объект `std::pair<std::string, int>`, и ссылка именно на него и вернётся из функции.
Лично я люблю небольшие C++ загадки, и пишу из ожидания что и читателю они по душе
В примере всё верно. Атрибут можно применять к переменным (как в примере в посте), так и к параметрам функций:
The attribute-token indeterminate may be applied to the definition of a block variable with automatic storage duration or to a parameter-declaration of a function declaration.
Ещё и регрессию в компиляторе нашли https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114559 на этом коде
Есть целый чатик https://t.me/supapro где помогают и подсказывают по C++
Поправили https://github.com/userver-framework/userver/commit/354b36e0a1d48109505533787cc01acd58621309
Стандартную библиотеку C++ (и скорее всего C) разметят этими атрибутами и не erroneous поведение (как в случае с std::cin) не будет приводить к предупреждениям.
В остальных местах могут появиться предупреждения
Авторы предложения на линал хотели добавить операторы, но столкнулись с целой кучей проблем https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p1673r13.html#arithmetic-operators-and-associated-expression-templates
В чачтности некоторые операторы не однозначны (например умножение может значить разное); некоторые операторы предполагают аллоцирование, что не ложится на парадигму невладения и убирает возможность указать другой результирующий тип и т.п.
Операторы возможно добавят позднее, а пока что - низкоуровневый интерфейс, на основе которого можно эффективно строить более высокоуровневые интерфейсы
Она там тоже не бесплатная, просто накладные расходы в отдельном потоке (*есть нюансы). К тому же, практически во всех языках с GC тоже есть способ получить память быстрее, без зануления. Просто эти техники бадьше спрятаны, чтобы ими не воспользовались случайно
Всё верно. В стандарте такого кода не будет, а в статье он без концептов для упрощения примера
Изначально не добавляли индексирование, чтобы мотивировать разработчиков писать более эффективный для времени компиляции код, где variadic pack распаковвывается в одну операцию.
Со временем, пришло понимание что для ряда задач это крайне не удобно и не улучшает ни читаемость кода, ни времена компиляции. При этом, после добавления новых способов работать с паком, там где можно распаковвть всё в одну операцию и так делают в одну операцию.
Увы, это наносит удар по производительности. Например убирание такой инициализации нулями позволяет раза в 3 ускорить некоторые горячие пути в коде (https://github.com/userver-framework/userver/commit/a24d86474cb850510484c0d78fa4924bea16505c)
О, и правда! Спасибо, сейчас поправим
Все операции работают над std::mdspan. В примере std::vector для того, чтобы показать как std::mdspan создать над массивом данных.
Да, std::mdspan не владеющий класс. Посмотрите примеры в proposal, часто нужны операции над частью матрицы и соответственно на практике нужен именно не владеющий класс
В случае арифметики насыщения, краевые значения (0 и 65535) не надо воспринимать как не валидные. Это просто значения
Пример задачи где такая арифметика хорошо подходит: наполнение резервуара. Есть резервуар на 65535 единиц. Чтобы вылить из него `x`, надо позвать
res = std::sub_sat<unsigned short>(res, x)
, чтобы долить `y` надо позватьres= std::add_sat<unsigned short>(res, y)
С такими операциями насыщения у вас резервуар не будет содержать больше чем он вмещает, а при заполнении нет риска что резервуар случайно "опустеет" из-за переполнения.
На всякий случай подсвечу, что "ошибочное поведение != ошибка компиляции". На ошибочное поведение компилятор выдаст предупреждение.
Подсвечу это в статье поярче
`auto i = {42};` уже превратили в ошибку компиляции, разрешили инициализацию агрегатов через круглые скобки, инициализацию атомиков тоже поправили, assert вот тоже поправили (об этом есть в посте).
Многие другие ужасы уже давно были поправлены, как и говорится в выступлении.
Ну и автор доклада активно участвует в комитете. Большинство подобных правок для упрощения базовых вещей языка - его заслуга
Она должна быть на очень хорошем уровне, на уровне BLAS/LAPACK. Авторы предложения заморачивались с тем, чтобы линал был бинарно совместим с эталонными реализациями BLAS/LAPACK. И соответственно, чтобы можно было использовать эталонные реализации напрямую в имплементации стандартных библиотек.
Компилятор должен хорошо оптимизировать подобное самостоятельно, даже без особых инструкций.
Получается у компиляторов по разному https://godbolt.org/z/Kfc1KhqKT
Заведу бегрепорты на компиляторы, где можно улучшить
Языков без загадок не существует
В некоторых странах "лоббирование" является легальным промыслом. И не смотря на все лоббирования на уровне одного гос. учреждения X в шататх, другое гос. учреждение Y в тех же штатах запрещает использовать рекомендуемые X "надёжные" языки в любых жизненно важных проектах.
будет warning
Пара хранится в map, но она хранится с константным first. Поэтому *d_map.begin() вернёт `const std::pair<const std::string, int>&`, от которого создастся временный объект `std::pair<std::string, int>`, и ссылка именно на него и вернётся из функции.
Лично я люблю небольшие C++ загадки, и пишу из ожидания что и читателю они по душе
В примере всё верно. Атрибут можно применять к переменным (как в примере в посте), так и к параметрам функций: