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

标签 c++ lambda typetraits

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

#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 和复制可构造性特征是否存在异常(exception)?

查看 godbolt 示例的链接: 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 关于元素类型的复制构造性,但我相信它将破坏将类型本身的 vector 存储为成员的类型:struct Node { std::vector<Node> children; } ,因为在这种情况下, Node 的复制构造性和std::vector<Node>将是相互依赖的。

关于C++ 不可复制的 lambda 行为可复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55656315/

相关文章:

c++ - glVertex3f 和 glVertex2fx 显示不同的结果

c++ - 应该首选 OpenACC 编译指示还是运行时例程?

python - 为什么不能在 lambda 表达式中使用 print()?

C++:在模板化类型中存在命名成员时在模板化类中提供类函数?

c++ - standard_layout 类的数据成员是否与对象的地址有固定的偏移量?

c++ - GCC 7 没有选择正确的类型特征特化

c++ - 在任何具有自动存储持续时间的对象被销毁之前调用的回调

c++ - C++ 和 C 中的 header 保护

c++ - 为什么 std::function 可以用具有不同返回类型的 lambda 构造?

sql - 如何使用LAMBDA表达式在LINQ中进行IN或CONTAINS处理?