【发布时间】:2020-09-24 23:54:31
【问题描述】:
鉴于以下不可复制的任务类和示例代码
#include <functional>
#include <iostream>
#include <string>
class Task
{
public:
Task()
{
}
Task(const Task& other) = delete;
Task& operator=(const Task& other) = delete;
Task(Task&& other) = default;
Task& operator=(Task&& other) = default;
void operator()() const
{
std::cout << "Task !" << std::endl;
}
};
int main()
{
auto task = Task();
auto lambda = [task = std::move(task)]
{
task();
};
std::function<void()> test = std::move(lambda);
test();
}
如果我用 auto 类型而不是 std::function 声明 test 变量,程序编译并运行完美,否则它将拒绝编译并出现此错误:
functional:1878:34: error: use of deleted function 'main()::<lambda()>::<lambda>(const main()::<lambda()>&)'
__dest._M_access<_Functor*>() =
^
31:42: note: 'main()::<lambda()>::<lambda>(const main()::<lambda()>&)' is implicitly deleted because the default definition would be ill-formed:
31:42: error: use of deleted function 'Task::Task(const Task&)'
13:5: note: declared here
我真的需要声明测试的类型,因为它最终将成为另一个类的成员。
我该怎么做?
我是否认为 std::function 应该以某种方式声明为可变的?
【问题讨论】:
-
出于兴趣,如果您将其弹出到调试器或智能 IDE 中,
auto将类型解析为什么?可能是一些您可以使用的好信息。 -
我很笨。这有点问题,不是吗?
-
打开的标签太多 :(
-
@NathanOliver 啊,完美。将其添加到重复列表中。
-
@dgmz 为了更直接地解决您的问题,每个 lambda 都有自己的匿名类型。但是,您可以使用
decltype(lambda) test = std::move(lambda);引用类型。
标签: c++ lambda move noncopyable