gpt4 book ai didi

c++ - 使用 lambda 捕获类后没有合适的复制构造函数

转载 作者:行者123 更新时间:2023-12-01 14:18:29 24 4
gpt4 key购买 nike

我有以下代码:

#include <iostream>

class Foo
{public:
Foo() {}
int a;
};

int main()
{
Foo foo;

auto lambda = [=]() mutable { std::cout << foo.a; };

}

一切正常,直到我需要向我的 Foo 类添加一个复制构造函数:

Foo(Foo& t) {}

它不会再编译,给出信息:

class 'Foo': no copy constructor available or copy constructor is declared 'explicit'

我已将 lambda 设为可变,因为我不想捕获 const Foo,但我认为发生的情况是 lambda 无法复制。另一个编译器有一个更有用的错误消息:

error: use of deleted function ‘main()::< lambda()>::< lambda>(main()::< lambda()>&&)’

和:

main()::< lambda()>::< lambda>(main()::< lambda()>&&)’ is implicitly deleted because the default definition would be ill-formed:

但是我真的不明白这个。那个隐式删除的函数是 lambda 的移动构造函数吗?我不明白为什么只向捕获的类(而不是 lambda)添加一个复制构造函数就会发生这种情况。

这就是我想象中的 lambda/functor 的样子:

class lambda
{public:

Foo foo; // <---- My captured variable/class
void operator()(){ std::cout << foo.a; }
}

那么将这些 lambda 之一复制到另一个涉及调用 Foo 的赋值运算符或复制构造函数?我不明白 Foo 有一个复制构造函数是如何导致失败的,或者什么是“格式错误”。我注意到的另一件事是,当 lambda 通过引用 [&] 捕获时没有问题。

编辑:它不能在此编译器上编译:

https://www.jdoodle.com/online-compiler-c++/

我在 Visual Studio 上,它无法编译。然而,当我做了一个小得多的例子时,它会编译,但仍然强调错误。在我的大型项目中,它无法编译。

最佳答案

copy constructor原型(prototype)是 A(const A&)。您实际上缺少复制构造函数上的 const 限定符,这就是发生错误的原因。

关于c++ - 使用 lambda 捕获类后没有合适的复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61395712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com