gpt4 book ai didi

c++ - 使用指向独立函数的指针调用 std::thread

转载 作者:可可西里 更新时间:2023-11-01 18:26:10 27 4
gpt4 key购买 nike

我试图调用 std::thread完美转发构造函数 ( template< class Function, class... Args > explicit thread( Function&& f, Args&&... args ); ) 带有指向函数的指针(不是指向成员 函数的指针),如下面的 M(N)WE 所示:

#include <thread>
#include <string>

static void foo(std::string query, int & x)
{
while(true);
}

int main() {
int i = 1;
auto thd = std::thread(&foo, std::string("bar"), i);
thd.join();
}

现场演示:https://godbolt.org/g/Cwi6wd

为什么代码无法在 GCC、Clang 和 MSVC 上编译,提示缺少重载 invoke (或类似的名字)?函数参数是指向函数的指针,因此它应该是 Callable。 ,对吧?

请注意:我知道使用 lambda 可以解决问题;我想了解问题出现的原因。

最佳答案

std::thread 存储传递给它的参数的拷贝。作为 Massimiliano Janes pointed out , 在临时调用者的上下文中进行评估。出于所有意图和目的,最好将其视为 const 对象。

因为 x 是一个非常量引用,它不能绑定(bind)到线程提供给它的参数。

如果你想让x引用i,你需要使用std::reference_wrapper

#include <thread>
#include <string>
#include <functional>

static void foo(std::string , int & )
{
while(true);
}

int main() {
int i = 1;
auto thd = std::thread(foo, std::string("bar"), std::ref(i));
thd.join();
}

Live Example

实用程序 std::ref 将即时创建它。

关于c++ - 使用指向独立函数的指针调用 std::thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47070592/

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