C++20 引入了DefaultConstructiblelambda。然而,cppreference.com 声明这仅适用于无状态 lambda:
如果未指定捕获,则闭包类型具有默认的默认构造函数。否则,它没有默认构造函数(这包括存在捕获默认值的情况,即使它实际上没有捕获任何内容)。
为什么这不扩展到捕获事物的 lambda DefaultConstructible?例如,为什么不能[p{std::make_unique<int>(0)}](){ return p.get(); },DefaultConstructible被俘者p会在哪里nullptr?
编辑:对于那些问我们为什么想要这个的人来说,这种行为看起来很自然,因为在调用要求函子可默认构造的标准算法时被迫编写这样的东西:
struct S{
S() = default;
int* operator()() const { return p.get(); }
std::unique_ptr<int> p;
};
Run Code Online (Sandbox Code Playgroud)
所以,我们可以传入S{std::make_unique<int>(0)},它会做同样的事情。
似乎能够编写[p{std::make_unique<int>(0)}](){ return p.get(); }而不是创建一个执行相同操作的结构要好得多。