#опытным
Ну что, мы все этого ждали 3 года и наконец оно случилось. Тут намедни утвердили С++26!
Подробно нововведения будем разбирать в будущих постах, но в этот раз давайте просто перечислим основные мажорные просто прикольные фичи нового стандарта. Поехали:
🔥 Триграфный оператор утверждения
??! - возвращает true, если выражение может быть скомпилировано, иначе false.template<typename T, typename U>
constexpr void can_add(T&& t, U&& u) {
if constexpr (x + s ??!) {
std::cout << "Addition can be performed!\n";
} else {
std::cout << "Addition can not be performed\n";
}
}
С++17 триграфы уничтожил, С++26 их вернул. "Компьютерные войны. Часть С++26. Месть триграфов".
🔥 Наконец-то в стандарт добавили тредпул! Класс std::thread_pool, который принимает количество потоков, политику планирования выполнения задач и размер очереди. Политики исполнения могут быть std::thread_pool::scheduling_policy::fifo и std::thread_pool::scheduling_policy::priority, а размер задается чиселкой, но по умолчанию очередь неограничена std::thread_pool::unbounded:
std::thread_pool pool(4, std::thread_pool::scheduling_policy::priority);
pool.enqueue([] {
std::cout << "Critical task!\n";
}, std::thread_pool::priority::critical);
pool.enqueue([] {
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::cout << "Normal task\n";
}, std::thread_pool::priority::normal);
🔥 Добавлена поддержка рефлексии! Еще один пункт, которого все ждали. Рефлексия позволяющей отслеживать и модифицировать элементы программы на стадии компиляции. Добавлен новый оператор (|.|) для получения метаинформации о грамматической конструкции. Для преобразования и обработки полученной в ходе инспектирования информации предложена библиотека std::meta и доступны такие возможности, как вычисления с константами.
constexpr int i = 42, j = 42;
static_assert((|.|)i == (|.|)j); // check if i and j values are equal in compile time
Кстати, отпишитесь в комментах, на что похож новый оператор. Что-то напоминает, но никак не могу конкретно сказать.
🔥 Предложена реализация массива переменного размера std::inplace_vector, размещаемого в стеке. И у него вообще ничем не ограничен размер!. API близок к std::vector, но элементы массива хранятся не на куче, а внутри объекта.
std::inplace_vector vec;
for (int i = 0; i < 10000; i++) {
vec.push_back(i);
}
И вообще никаких аллокаций!
🔥 Внесены изменения для усиления безопасности стандартной библиотеки, такие как проверки допустимых значений и выхода за границы буфера. Например, при доступе к элементу "reference operator[](size_type idx) const;" добавляется проверка условия "idx < size()". И мякотка: проверка даже рантаймовых контейнеров происходит на этапе компиляции!
🔥 Добавлен атрибут
[[maybe_unused]] для блока кода. Бывает начинаете писать какой-то сервис и тут бац! бизнес требования поменялись и допинывание сервиса до прода ушло глубоко в конец бэклога. Чтобы новые сотрудники не гадали, почему код есть, но ничего не работает, очень полезно пометить его атрибутом maybe_unused:[maybe_unused]] {
// potentially unused code
}Такой код и компилятор может не добавлять в бинарник, если докажет, что код реально не используется нигде.
🔥 В стандарт добавили поддержку линейной алгебры! Появились матрицы, их можно умножать, получить вектор из ее диагонали, посчитать определитель, изменить форму матрицы и тд. Куча всего на самом деле.
std::linalg::matrix<double> A(3, 3);
A(0,0) = 1; A(0,1) = 2; A(0,2) = 3;
A(1,0) = 4; A(1,1) = 5; A(1,2) = 6;
A(2,0) = 7; A(2,1) = 8; A(2,2) = 9;
auto A2 = std::linalg::mul(A, A);
auto diag = std::linalg::diag(A); // std::vector<double> {1, 5, 9}
double det = std::linalg::det(A); // 0
auto flat = std::linalg::reshape(A, 1, 9);
PS Надеюсь, что вы попались на первоапрельскую шутку) По этой ссылочке можно посмотреть реальные нововведения.
Don't be fooled. Stay cool
#cpp26 #fun