而加了移动的捕获变量的 lambda 就不满足了。
我觉得这句话是不对的.
这里lambda变得不可copyconstructable的原因是你的lambda有一个std::unique_ptr的成员变量.
你move一个int看看,就没有问题.
而且我不认为你加了mutable就可以通过编译.
因为mutable只是去掉了lambda里面unique_ptr前面那个隐式的const qualifier.
struct Foo
{
void bar()
{
}
};
void api(std::function<void()>&& callback)
{
callback();
}
void caller()
{
auto ptr = std::make_unique<Foo>();
api([p=std::move(ptr)]() mutable{
p->bar();
});
}
int main()
{
caller();
return 0;
}
我编译了一下,错误信息显示仍然是调用了unique_ptr的copy ctor,和预期相符.
In file included from /usr/include/c++/10/functional:59,
from main.cpp:1:
...
error
...
...
main.cpp:19:25: note: ‘caller()::<lambda()>::<lambda>(const caller()::<lambda()>&)’ is implicitly deleted because the default definition would be ill-formed:
19 | api([p=std::move(ptr)]() mutable{
| ^
main.cpp:19:25: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Foo; _Dp = std::default_delete<Foo>]’
In file included from /usr/include/c++/10/memory:83,
from main.cpp:2:
/usr/include/c++/10/bits/unique_ptr.h:468:7: note: declared here
468 | unique_ptr(const unique_ptr&) = delete;
| ^~~~~~~~~~
【 在 milksea 的大作中提到: 】
: 用到回调函数,为了支持虚函数,不用模板类型参数表示回调函数,而用了 std::function 包装。结果用 lambda 表达式传参的时候,有 move 捕获变量就编译失败了。代码类似这样:
: void api(std::function<void()>&& callback)
: {
: ...................
--
修改:allegro FROM 73.63.209.*
FROM 73.63.209.*