🍔 std::function — больше не дефолт. Знакомьтесь…

🍔 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 по-прежнему уместен
Просмотры: 148
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти