因为我想给我的异步、反应器样式模式、回调一个来自 boost::asio 的未来形式的结果,我遇到了一个编译错误,即我不明白的 constness 冲突:
当我想调用一个打包任务以实现基本承诺时,即通过 lambda 使附加的未来做好准备,我得到了 constness 这个编译器错误。
#include <future>
#include <utility>
int main() {
std::packaged_task<int()> task{
[] () {
return 5;
}
};
auto f = [task2 = std::move(task)] () {
task2();
};
f();
}
task2
在我的 gcc 编译器上调用operator() 失败:
/home/markus/CLionProjects/untitled5/main.cpp:12:15:错误:不匹配调用'(const std::packaged_task) ()' 12 |
任务2();| ^ 在 /home/markus/CLionProjects/untitled5/main.cpp:1 中包含的文件中:/usr/include/c++/9.3.0/future:1548:7:注意:候选人:'void std::packaged_task<_Res( _ArgTypes ...)>::operator()(_ArgTypes ...) [with _Res = int; _ArgTypes = {}]' 1548 |
运算符()(_ArgTypes... __args) | ^~~~~~~~ /usr/include/c++/9.3.0/future:1548:7: 注意:将 'const std::packaged_task*' 作为 'this' 参数传递会丢弃限定符
如果我没看错的话,packaged_task 突然变成了一个 const,所以编译器错误,packed_task::operator() 方法没有被标记为 const。我在 task 和 task2 之间做的唯一一件事就是调用 move ctor packaged_task( packaged_task&& rhs ) noexcept;
,这应该 AFAIK 不会改变常量。显然我错过了一些必不可少的东西。