std::function
может принимать вызов только для движения, но только ограничиваясь тем, чтобы всегда быть только для движения. Он использует стирание типа для хранения объекта, поэтому его поведение stati c должно представлять функциональность наименьшего общего знаменателя, которая ему требуется для объектов, которые он хранит.
Но вот что есть: есть много мест в C ++ и его стандартной библиотеке, которые ожидают, что вызываемый объект должен быть копируемым. Под «много» я подразумеваю всю библиотеку стандартных алгоритмов. Даже концепция C ++ 20 indirect_unary_predicate
требует copy_constructible
. По сути, все алгоритмы имеют свободу копирования данной функции по желанию; они даже воспринимают эти функции как значение .
Тип std::function
только для перемещения никогда не может быть использован ни с одним из таких алгоритмов. А «только для перемещения» - единственный способ для std::function
принимать типы только для перемещения.