gpt4 book ai didi

c++ - 没有用于调用类型为 'const std::__1::packaged_task' 的对象的匹配函数,但 `std::is_const` 返回 false

转载 作者:行者123 更新时间:2023-11-28 04:28:16 25 4
gpt4 key购买 nike

#include <functional>
#include <future>
#include <iostream>
#include <thread>

template<class Func, class... Args>
void submit(Func&& f, Args&&... args) {
using returnType = typename std::result_of<Func(Args...)>::type;
auto task1 = std::packaged_task<returnType()>(std::bind(std::forward<Func>(f), std::forward<Args>(args)...));
std::cout << std::is_const<decltype(task1)>::value << " task1 const or not" << std::endl;

auto tmp = [task2=std::move(task1)]() {
std::cout << std::is_const<decltype(task2)>::value << " const or not" << std::endl; // print 0, which means non-const
// task2(); // uncomment this line, compilation will fail
};
tmp();

}

int main() {
submit([&] {
std::cout << "fooooooooo" << std::endl;
});
return 0;
}

我知道错误的含义;我知道使 lambda mutable 会有所帮助并且我对其进行了测试,但我想知道 const 来自哪里。注意 std::is_const 返回 false,这让我很困惑。

编辑:抱歉忘了提到编译器。我使用的是 clang-1000.10.44.2。命令是clang++ -std=c++14 test.cpp -o test

最佳答案

我假设您使用的 Clang 版本最高为 7.0。 bug report 38325 记录了此行为.但是,它也说明了为什么您看到的行为并非完全不合理。引用 Bug 报告中的 Richard Smith:

Per [expr.prim.id.unqual]p2, the type of 'x' or 'y' within the lambda is the type of a class member access expression naming the corresponding capture. Those members are of type (non-const) int, but the lambda's *this parameter is const-qualified

为了解释它,回想一下 lambda 表达式引入了一个独特的闭包类型。就好像你写道:

struct unique {
decltype(task1) task2;
void operator()() const { /* Your code */ }
};
unique const tmp = unique{std::move(tmp1)};

现在当 tmp 是 const 时,标识符 task2 的“命名实体的类型”不是 const 限定的(成员类型没有简历资格)。所以你有它。尽管 task2 在用作函数调用运算符左侧的 postfix-expression 时保留了 const 限定条件,但在检查 decltype(task2) 时您可能看不到这一点。解决方法是强制将 task2 视为正则表达式,不受 id 表达式的 decltype 特殊规则的约束。您可以通过添加括号来做到这一点:

std::is_const<std::remove_reference_t<decltype((task2))>>::value

decltype((task2))会适配(task2)的类型和值类别,即decltype(task1) const&remove_reference_t 为我们提供了 decltype(task1) const 并且您检查的谓词报告了您所期望的内容。

关于c++ - 没有用于调用类型为 'const std::__1::packaged_task<void ()>' 的对象的匹配函数,但 `std::is_const` 返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53701229/

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