用到回调函数,为了支持虚函数,不用模板类型参数表示回调函数,而用了 std::function 包装。结果用 lambda 表达式传参的时候,有 move 捕获变量就编译失败了。代码类似这样:
void api(std::function<void()>&& callback)
{
callback();
}
void caller()
{
auto ptr = std::make_unique<Foo>();
api([p=std::move(ptr)]() mutable{
p->bar();
});
}
按惯例,错误信息还是一下子难以看懂。最后查来查去搞明白 std::function 要求保存的可调用对象是 copy constructable 的,而加了移动的捕获变量的 lambda 就不满足了。这问题还不好绕过去,这里最后改成 shared_ptr 了。
感觉 C++ 规则多还是一言难尽。惭愧我一开始写这段代码连mutable都不知道加。
--
FROM 120.36.49.*