🍔 std::function — больше не дефолт. Знакомьтесь, std::copyable_function (C++26) — 8 июля 2026 г. в 10:50:01.578
🍔 std::function — больше не дефолт. Знакомьтесь, std::copyable_function (C++26) Если в новом коде ты по привычке тянешься к std::function — в C++26 для большинства случаев есть вариант лучше. std::function живёт с C++11, но у него два врождённых дефекта. Первый — он раздувает бинарь. Второй, более коварный — дефект const-корректности: operator() помечен const, но при этом спокойно вызывает не-const operator() хранимого объекта. Починить нельзя — сломается ABI. std::copyable_function — то, чем std::function должен был быть с самого начала: копируемый, const-корректный, поддерживает весь набор квалификаторов (const, noexcept, &/&&). #include <functional> // const здесь означает const на самом деле std::copyable_function<int() const> f = [x = 42] { return x; }; int y = f(); // 42 // std::copyable_function<int() const> bad = [x=42]() mutable {...}; // ❌ mutable не пройдёт std::copyable_function<void()> g; // пустой // g(); // ⚠️ UB, а НЕ bad_function_call ‼️ Важный нюанс: вызов пустого copyable_function — это UB, а не исключение. Сделано осознанно, ради консистентности с остальной библиотекой. ⚠️ Не выкидывай std::function бездумно: • у copyable_function нет target() / target_type() — никакой RTTI-интроспекции • пустой вызов → UB вместо bad_function_call: ловившие исключение сломаются молча • для стабильного ABI существующих интерфейсов std::function по-прежнему уместен

