Мой предыдущий тред в Development собрал самое большое число ответов аж с сентября, то есть за последние 9 месяцев, и это лишний раз подтверждает упадок этого форума. Полагаю, кто-то должен это изменить, и поэтому мы с тобой, ЛОР, поговорим сегодня про C++.
Начиная с C++26 вместо std::function вводится пачка новых классов: std::copyable_function, std::move_only_function (доступна с C++23) и std::function_ref. Что же не так с оригинальным std::function, ты можешь спросить? А вот что:
#include <functional>
#include <print>
struct call_me {
int x = 0;
void operator()() {
std::print("x was {}\n", x++);
}
};
int main() {
const std::function<void()> f = call_me{};
f();
}
Несмотря на то, что переменная f объявлена константной (люблю оксюмороны!), у неё есть внутреннее состояние и оно меняется при вызовах. Компилятор это без проблем хавает.
Так вот, ковыряясь в том, зачем и кто вообще смог так насрать себе в штаны сам, я наткнулся на статью ребят, которые подводят список подобных косяков комитета C++, когда фичи живут по 10 лет и объявляются устаревшими.
Небольшой список фич, которые были придуманы, оказались не нужны/бесполезны/вредны и выкинуты:
- Известный
vector<bool>, живущий издревле в STL и про который все говорят, что его надо избегать. Частично заменяетсяstd::bitset. std::auto_ptr. Бесполезен, ломает контейнеры, выкинут на помойку в C++17.- Указание исключений у функции в формате
throw(X, Y). Так же выкинуто в C++17. std::iteratorобъявили устаревшим в C++17, собираются удалить в C++26.std::aligned_storageиstd::aligned_unionдобавлены в C++11, объявлены устаревшими в C++23, скоро удалят.- Ключевое слово
registerудалено в C++17, хотя всё ещё доступно в Си. std::get_temporary_bufferиstd::raw_storage_iteratorудалены в C++20.- Потрясающее по эпичности фиаско с интерфейсом для сборщиков мусора.
std::declare_reachableсотоварищи были добавлены в C++11. Выяснилось, что сборщики мусора для C++ писать либо никто не умеет, либо никто не хочет, поэтому в C++23 это всё удалили и сделали вид, что ничего не было. - Абсолютное безумие вокруг концептов, модулей и поддержки сети. Предложения одобряли, вновь отклоняли, переделывали, и по итогу теми же модулями до сих пор никто не пользуется.
- Сопрограммы (coroutines). В том виде, в котором они есть в C++, это просто ужас. Достаточно того, что корутины требуют выделения памяти из кучи во время работы, а значит вообще не подходят для случаях, когда требуется серьёзная производительность. Например, в любом коде, требующим работы в реальном времени и не позволяющем делать системные вызовы.
Просто лютый трешак, который никто подчищать пока не собирается:
std::regex– лютый тормоз, рекомендуется не использовать.- Мертворождённый
std::simd, добавленный в C++26 и уже с ходу не нужный вообще никому, потому что код сstd::simdв два-три раза тормознее чем со сторонними библиотеками, просто голыми интринсиками, и даже медленнее чем просто циклfor. std::async. Дескруктор ждёт завершения асинка и поэтому может залочить весь код тебе. Наконец починили в C++26, но эта штука была сломана 15 лет.- Отвратительно спроектированный
<iostream>. Его наконец можно выкинуть и использоватьstd::print, но не все про это знают. - Абсолютно тормозные контейнеры
map,set,unordered_map. Вместо первого можно использоватьflat_mapиз C++23. Контейнеры в стандартной библиотеке Rust (BTreeMap) и другие реализации B-Tree Map их обгоняют по производительности, но тем не менее в C++ выбирают убогий дефолт.
Решения многих из этих проблем существуют в Boost и сделаны там гораздо лучше. Но в то же время возникает важный вопрос: зачем вообще нужен настолько плохо спроектированный язык, где каждое следующее поколение инженеров, работающих над ним, отменяет решения предыдущих, а код под новые стандарты часто нужно переписывать если не с нуля, то очень близко к тому? Даже процесс разработки Rust с его поехавшими клоунами в юбках на этом фоне выглядит адекватным.
В общем, всё печально, ЛОР. Такие дела.








