【发布时间】:2020-07-08 15:46:20
【问题描述】:
函数std::async定义如下:
template< class Function, class... Args>
std::future<std::result_of_t<std::decay_t<Function>(std::decay_t<Args>...)>>
async( Function&& f, Args&&... args );
正如我们所见,它将两个参数都作为右值引用,或者更准确地说,作为“通用引用”(对模板参数类型的右值引用)。
传递一个简单的函数指针(例如std::async(myfunction))有效,但我不明白为什么。
我的理解是,您可以将右值绑定到 const 左值引用,反之则不行。您不能将左值绑定到右值引用(不使用 std::move 将其转换为右值)。
但是 - 当调用 std::async(myfunction) 时,std::async 模板被实例化为 Function = <some_func_type>,因此变为 std::async<some_func_type>(some_func_type&&)。也就是说 - 它需要一个右值引用。但是,我们将它传递给一个左值。
为什么会起作用?
【问题讨论】:
-
通用引用不是右值引用,它们就是这样得名的
-
官方名称是转发参考btw
-
@idclev463035818 确实,但如果我理解正确的话,通用参考
Function&&因为Thing&&当Function = Thing。对吗? -
请注意,当
T = int &,然后T && = int &(不是int &&)以来,粗略地说,引用到引用被简化为只是引用,结果是一个右值引用,仅在“右值引用到右值引用”的情况,在所有其他三种情况下都是左值引用。非正式地,折叠规则是& = & & = && & = & &&和&& && = &&。因此T &&形式的类型可以是任何类型的引用、右值或左值,而不仅仅是右值。