tgoop.com/cxx95/83
Last Update:
#creepy
std::move_only_function - самая позорная фича C++
В С++23 добавили std::move_only_function. Это тот же std::function, но в нем основное различие - нет copy-конструкторов, то есть с объектом можно сделать только move.
(Недавно был пост про самую простую реализацию std::function).
В чем кринж этой фичи? Это НЕ добавление "нового класса", с разницей как между std::string
и std::string_view
.
Это просто "улучшение" старого std::function
. Если бы std::function
можно было нормально менять, то он бы выглядел, как сегодняшний std::move_only_function
. Но менять его нельзя, по причинам описанным в посте про ABI.
Почему я думаю, что это улучшение старого класса, а не новый класс:std::function
и так не нужны совсем. Как минимум это бесполезно, как максимум это создает разные проблемы при ненамеренном копировании функторов.std::function
.
То есть Комитет по C++, не имея возможности и воли решить вопрос со сломом ABI, решает дублировать классы со стремными названиями и делает вид что так и должно быть. Это не нормально и вызывает у всех много вопросов. Еще на юзеров перекладывается обязанность переписать используемый тип, вместо того чтобы просто обновить версию libstdc++
.
Для почти всех классов STL есть идеи по улучшению, и если просто делать новые классы, то это будет жесть.
Можно везде использовать std::move_only_function
вместо std::function
, но лучше бы std::function
был переделан в нормальный вид без нового класса.