Если в новом коде ты по привычке тянешься к
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 по-прежнему уместен📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#под_капотом