C++23 引入了std::function
的表亲std::move_only_function
,就像它的名字一样,它是一个只移动可调用对象(demo)的只移动包装器:
#include <functional>
#include <memory>
int main() {
auto l = [p = std::make_unique<int>(0)] { };
std::function<void(void)> f1{std::move(l)}; // ill-formed
std::move_only_function<void(void)> f2{std::move(l)}; // well-formed
}
但与 不同std::function
的是,该标准没有为其定义演绎指南(演示):
#include <functional>
int func(double) { return 0; }
int main() {
std::function f1{func}; // guide deduces function<int(double)>
std::move_only_function f2{func}; // deduction failed
}
有禁止 CTAD 的理由吗?