【发布时间】:2020-04-23 19:47:32
【问题描述】:
我有以下代码:
#include <iostream>
class Foo
{public:
Foo() {}
int a;
};
int main()
{
Foo foo;
auto lambda = [=]() mutable { std::cout << foo.a; };
}
一切正常,直到我需要向我的 Foo 类添加一个复制构造函数:
Foo(Foo& t) {}
它不再编译,给出消息:
类'Foo':没有可用的复制构造函数或复制构造函数是 声明为“显式”
我使 lambda 可变,因为我不想捕获 const Foo,但我认为正在发生的事情是无法复制 lambda。另一个编译器有一个更有用的错误信息:
错误:使用已删除的功能 ‘main()::
:: (main():: &&)'
和:
main()::::(main()::&&)' 是隐式的 删除,因为默认定义格式不正确:
但我真的不明白这一点。那个隐式删除的函数是 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 上,但它无法编译。然而,当我做了一个小得多的例子时,它会编译,但仍然强调错误。在我较大的项目中,它无法编译。
【问题讨论】:
-
您的代码(带有添加的“复制构造函数”)编译时无需窥视
MSVC和clang-cl(使用 C++17 标准)。您使用的是什么编译器和标准?
标签: c++ lambda copy-constructor