C++ 不可复制的 lambda 行为可复制?

C++ non-copyable lambda behaves copyable?

为什么下面的代码可以编译?

#include <memory>
#include <vector>

int main()
{
    std::vector<std::unique_ptr<int>> uncopyableStuff;
    for(int i = 0; i < 5; ++i)
        uncopyableStuff.emplace_back(std::make_unique<int>(i));
    auto lambda = [uncopyableStuff = std::move(uncopyableStuff)](){};
    static_assert(std::is_copy_constructible<decltype(lambda)>::value);
}

在我看来 lambda 是不可复制的,因为当我尝试像这样复制它时:

auto copy = lambda;

这给了我一个编译错误(如我所料)。 lambda 和复制可构造性特征是否有一些例外?

请参阅 link 以获取神栓示例: https://godbolt.org/z/GByclH

编辑:

确定 lambda 在尝试复制时是否会编译的正确方法是什么。我想我对给定可调用对象的理论副本构造性不感兴趣,但对成功的副本构造的检测不感兴趣。 vector拷贝构造函数这样定义我还是觉得很奇怪

Is there some exception for lambda's and copy constructability traits?

没有。如果你测试 std::is_copy_constructible<std::vector<std::unique_ptr<int>>>::value 你会发现它也是如此。

原因是 std::vector 具有可访问且未删除的复制构造函数,即使元素类型是不可复制的。如果复制构造函数被实例化,它将无法编译,但那是在直接上下文之外,因此无法被 std::is_copy_constructible 特征检测到。

在元素类型的复制可构造性上创建 std::vector SFINAE 的复制构造函数可能很诱人,但我相信它会破坏将类型本身的向量存储为成员的类型: struct Node { std::vector<Node> children; },因为在这种情况下,Nodestd::vector<Node> 的复制可构造性将相互依赖。