🎯 std::move_only_function: зачем нам ещё один тип функций?
🎯 std::move_only_function: зачем нам ещё один тип функций?
std::function — хороший инструмент. Но есть одна проблема: он требует копируемости. А что, если твой callable некопируемый? В C++23 есть решение — std::move_only_function.
Представь: ты хочешь передать лямбду, которая захватывает std::unique_ptr. С std::function — UB или не скомпилируется. С std::move_only_function — просто работает.
// C++23
#include <functional>
#include <memory>
auto make_task(std::unique_ptr<int> data) {
// ✅ Работает! std::function здесь не справится
return std::move_only_function<void()>{
[d = std::move(data)]() {
std::println("Value: {}", *d);
}
};
}
std::function — хороший инструмент. Но есть одна проблема: он требует копируемости. А что, если твой callable некопируемый? В C++23 есть решение — std::move_only_function.
Представь: ты хочешь передать лямбду, которая захватывает std::unique_ptr. С std::function — UB или не скомпилируется. С std::move_only_function — просто работает.
// C++23
#include <functional>
#include <memory>
auto make_task(std::unique_ptr<int> data) {
// ✅ Работает! std::function здесь не справится
return std::move_only_function<void()>{
[d = std::move(data)]() {
std::println("Value: {}", *d);
}
};
}