问题本身仅与以下几点相关std::async()
:在定义操作结果时,std::async()
使用std::result_of<...>::type
其所有参数被std::decay<...>::type
'ed。这是合理的,因为std::async()
采用任意类型并将它们转发以将它们存储在某个位置。为了存储它们,函数对象和参数都需要值。因此,std::result_of<...>
类似这样使用:
typedef std::result_of<void (*(int))(int&)>::type result_type;
...并且由于int
不能绑定到int&
(不是需要绑定int
左值类型int&
),因此失败。在这种情况下失败意味着std::result_of<...>
没有定义嵌套的type
.
一个后续问题可能是:这种用于实例化的类型是什么std::result_of<...>
?这个想法是滥用由 组成的函数调用语法ResultType(ArgumentTypes...)
:而不是结果类型,而是传递函数类型,并std::result_of<...>
确定在调用具有给定参数列表的函数类型时调用的函数的类型。对于函数指针类型,它并不是那么有趣,但函数类型也可以是需要考虑重载的函数对象。所以基本上,std::result_of<...>
是这样使用的:
typedef void (*function_type)(int&);
typedef std::result_of<function_type(int)>::type result_type; // fails
typedef std::result_of<function_type(std::reference_wrapper<int>)>::type result_type; //OK