gpt4 book ai didi

c++ - 构造线程时调用的运算符重载函数

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

最近,我在学习线程时看到了这段代码,其中有一部分我无法理解。
这是代码:

#include <iostream>
#include <thread>

void foo() { std::cout << "foo()\n"; }
void bar() { std::cout << "bar()\n"; }

class task
{
public:
task() { cout << "task constructor\n"; }

void operator()() const
{
cout << "operator()\n";
foo();
bar();
}
};

int main()
{
task tsk;
std::thread t(tsk);
t.join();
return 0;
}

我不明白的部分是在创建“tsk”对象之后。构建“t”线程时 std::thread t(tsk);
调用了运算符重载函数
我不明白为什么会调用运算符重载“()”,以及这是什么时候发生的。
如果有人能向我解释这些东西,我将非常感激。

最佳答案

std::thread接受一个可调用对象来执行。当你重载时 operator()() ,你正在制作你的 task对象可调用。

例子:

tsk();
// Output
task constructor
operator()
foo()
bar()

删除您对 operator()() 的定义...

tsk();
// Output
error: type 'task' does not provide a call operator

std::thread t(tsk);除非 task 否则甚至不会编译是一个可调用对象。

如果你问为什么它会这样,我们看看n3376 (C++11 标准草案)[thread.thread.constr]。构造函数std::thread t(tsk);正在调用是:

template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );

这个构造函数执行INVOKE(DECAY_COPY( std::forward<F>(f)), DECAY_COPY(std::forward<Args>(args))...) .换句话说,它调用 f(arg1, arg2, arg3...) .

如果你想要比我更好的非官方文档,试试cppreference .

关于c++ - 构造线程时调用的运算符重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32046802/

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