我遇到了std::thread
的麻烦,我认为(从我得到的错误)是std::result_of
不喜欢我的仿函数造成的。
我希望这可以编译:
#include <iostream>
#include <thread>
struct Foo
{
template <class T>
void operator() ( T& value ) // replacing T& by T fixes the issue
{
std::cout << "Foo output: " << value << std::endl;
}
};
int main()
{
auto t = std::thread( Foo(), 42 );
t.join();
}
但我得到一个编译器错误(g ++和clang ++)说:
(...) no type named 'type' in 'std::result_of<Foo (int)>'
正如评论中所述,将T&
替换为T
似乎可以解决问题,任何人都可以帮助我了解发生了什么/我做错了什么?
修改
通过包装我的仿函数来帮助编译器似乎也可以工作:
auto t = std::thread( std::function< void(const int&) >(Foo()), 42 );
我只是不明白为什么这是必要的。