构造线程

时间:2015-08-17 09:22:37

标签: c++ operator-overloading

最近,我发现这段代码是学习线程的一部分,还有一部分我无法理解。
这是代码:

#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;被召唤的时候发生了这件事。
如果有人能解释我的话,我会非常高兴。

1 个答案:

答案 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