Обоснование создания std :: function требует конструктора копирования - PullRequest
3 голосов
/ 29 января 2020

В последнее время я пытался сделать что-то вроде этого:

auto x = std::make_unique<int>(1);
auto l = [y = std::move(x)]() { return *y; };
std::function<void()> f(std::move(l)); //error, requires copy construction

И, к моему огромному разочарованию и растерянности, это бросило мне кучу сообщений об ошибках. Как вы уже знаете, std::function запрещает конструкцию из типов, которые не являются копируемыми. Есть ли конкретная c причина, почему это так? Или это упущение в стандарте? Какие проблемы будет создавать конструкция из типов только для перемещения?

1 Ответ

3 голосов
/ 29 января 2020

std::function может принимать вызов только для движения, но только ограничиваясь тем, чтобы всегда быть только для движения. Он использует стирание типа для хранения объекта, поэтому его поведение stati c должно представлять функциональность наименьшего общего знаменателя, которая ему требуется для объектов, которые он хранит.

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

Тип std::function только для перемещения никогда не может быть использован ни с одним из таких алгоритмов. А «только для перемещения» - единственный способ для std::function принимать типы только для перемещения.

...