Daily bit(e) C++. std::move_only_function
Добавлено 5 октября 2026 в 21:59
Daily bit(e) C++ 145, std::move_only_function – версия std::function из стандарта C++23, поддерживающая только перемещение.

std::move_only_function (появившаяся в C++23) – это версия std::function, допускающая только перемещение.
Помимо поддержки некопируемых функциональных объектов, std::move_only_function полностью поддерживает семантику вызова и учитывает квалификатор const.
#include <functional>
#include <memory>
struct X
{
void operation(int) {};
int x;
};
// Не скомпилируется: лямбда-выражение не допускает
// копирующего конструирования, так как anchor не допускает
// копирующего конструирования.
// std::function<void(void)> a =
// [anchor=std::make_unique<int>(42)](){};
// OK
std::move_only_function<void(void)> b =
[anchor=std::make_unique<int>(42)](){};
// поддержка вызываемых объектов
// Обратите внимание: тип ведет себя так, словно это обычная функция;
// для получения дополнительной информации поищите сведения
// об "Abominable Function Types" (отвратительных типах функций).
std::move_only_function<void (X&, int)> c = &X::operation;
std::move_only_function<int (X&)> d = &X::x;
X x;
c(x, 42); // вызывает x.operation(42);
int y = d(x); // то же, что и int y = x.x;
// учитывает const
const std::move_only_function<void(void)> e = [](){};
// e(); // не скомпилируется: можно сохранить,
// но нельзя вызвать неконстантные функции
const std::move_only_function<void(void) const> f = [](){};
f(); // OK
