1

因为我想给我的异步、反应器样式模式、回调一个来自 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 不会改变常量。显然我错过了一些必不可少的东西。

4

0 回答 0