在下面的代码中,
&&
是一个通用引用吗?template <class Function = std::greater<int> > void f(Function&& f = Function());
&&
是一个通用引用吗?template <class Function = std::greater<int> > void f(Function&& f = Function());
int&&
和模板代码中的右值引用,即T&&
。这很重要,因为在模板代码中会涉及到引用折叠规则,因此使用这个术语有助于教学。它被称为“通用引用”的原因是它可以绑定到任何东西。Function&&
就是一个右值引用。然而,在Scott Meyer的虚构术语中,Function&&
是你例子中的一个通用引用
。&& 是通用引用吗?
有点像。就像复活节兔子和圣诞老人一样,其实并没有所谓的“通用引用”(如果我破坏了你的幻想,对不起)。在标准中并没有出现“通用引用”这个术语。它是由Scott Meyers创造的术语,用于描述模板化右值引用时“特殊推导规则”生效的情况。
你展示的代码是有效的。在这种情况下,“特殊推导规则”确实适用。也就是说,当你将一个左值参数A传递给f时,Function会推导为A&。因此按照Scott的定义,是的,Function是一个“通用引用”。