默认模板类型可以是通用引用吗?

3
在下面的代码中,&&是一个通用引用吗?
template <class Function = std::greater<int> > void f(Function&& f = Function());
3个回答

7
术语“通用引用”是Scott Meyers杜撰的一个术语,目的是区分普通右值引用,即int&&和模板代码中的右值引用,即T&&。这很重要,因为在模板代码中会涉及到引用折叠规则,因此使用这个术语有助于教学。它被称为“通用引用”的原因是它可以绑定到任何东西。
请记住,在C++语言中并不存在所谓的“通用引用”,Function&&就是一个右值引用。然而,在Scott Meyer的虚构术语中,Function&&是你例子中的一个通用引用

+1 这就像我们同时从同一份脚本上打字一样。干得好。 - Howard Hinnant
谢谢,我也+1了你,因为我可能大部分都是通过阅读你在SO上的答案学到的。 - Jesse Good
1
@StephenLin:继续用代码检查那些答案!我在这个问题上也这样做了。当人们不用一点代码检查他们的答案时,这是令人烦恼的。 - Howard Hinnant

3

&& 是通用引用吗?

有点像。就像复活节兔子和圣诞老人一样,其实并没有所谓的“通用引用”(如果我破坏了你的幻想,对不起)。在标准中并没有出现“通用引用”这个术语。它是由Scott Meyers创造的术语,用于描述模板化右值引用时“特殊推导规则”生效的情况。

你展示的代码是有效的。在这种情况下,“特殊推导规则”确实适用。也就是说,当你将一个左值参数A传递给f时,Function会推导为A&。因此按照Scott的定义,是的,Function是一个“通用引用”。


1

看起来std::forward<Function>在您的函数调用中正确转发参数类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接