使 std::function 需要复制构造函数的基本原理

bar*_*top 4 c++ c++14

我最近尝试做这样的事情:

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
Run Code Online (Sandbox Code Playgroud)

令我非常失望和困惑的是,它向我抛出了一堆错误消息。如您所知,std::function不允许从不可复制构造的类型进行构造。有什么具体原因吗?或者它是标准中的一个疏忽?仅移动类型的构造会带来什么问题?

Nic*_*las 5

std::function 可以采用仅移动可调用,但只能通过将自身限制为始终仅移动。它使用类型擦除来存储对象,因此它的静态行为必须代表它所存储的对象所需的最低公分母功能。

事情就是这样:在 C++ 及其标准库中有很多地方期望可调用对象是可复制的。“很多”是指整个标准算法库。即使是 C++20 概念也indirect_unary_predicate需要copy_constructible. 本质上,所有算法都被赋予了随意复制给定函数的自由;他们甚至通过价值

std::function任何此类算法都不能使用仅移动类型。仅移动是采用仅std::function移动类型的唯一方法。