【发布时间】:2021-06-01 04:51:51
【问题描述】:
我最近尝试做这样的事情:
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 不允许从不可复制构造的类型构造。有什么具体原因吗?还是标准中的一个忽略?仅移动类型的构造会带来什么问题?
【问题讨论】:
-
当您复制
std::function时会发生什么? -
std::function必须是可复制的,否则您将失去该类型的巨大优势。并且有条件地删除复制构造函数(从而启用仅移动对象)不起作用,因为std::function依赖于类型擦除。只有std::function的构造函数会知道一个类型是否可复制。但是该信息已经在类范围内丢失了。