最近,我发现这段代码是学习线程的一部分,还有一部分我无法理解。
这是代码:
#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;
}
我不了解的部分是在创建&#34; tsk&#34;宾语。在构建&#34; t&#34;线程std::thread t(tsk);
操作员过载功能被称为。
我不明白为什么操作员超载&#34;()&#34;被召唤的时候发生了这件事。
如果有人能解释我的话,我会非常高兴。
答案 0 :(得分:2)
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。