C++ 默认模板类型是否可以是通用引用?

C++ 默认模板类型是否可以是通用引用?,c++,templates,c++11,reference,universal-reference,C++,Templates,C++11,Reference,Universal Reference,在下文中,&&是通用参考吗 template <class Function = std::greater<int> > void f(Function&& f = Function()); template void f(Function&&f=Function()); &&是通用参考吗 template <class Function = std::greater<int> > void f(Function&&am

在下文中,
&&
是通用参考吗

template <class Function = std::greater<int> > void f(Function&& f = Function());
template void f(Function&&f=Function());
&&是通用参考吗

template <class Function = std::greater<int> > void f(Function&& f = Function());
有点。像复活节兔子和圣诞老人一样,实际上没有一个通用的参考(如果我给你弄坏了,对不起)。通用参考一词并未出现在标准中。这是Scott Meyers创造的术语,用于描述当“特殊演绎规则”处于活动状态时模板化的右值引用


您显示的是有效代码。在这种情况下,特殊扣除规则确实适用。也就是说,当您将左值参数
A
传递给
f
时,
函数将推断为
A&
。因此,根据Scott的定义,是的,
函数
是一个“通用引用”。术语
通用引用
是Scott Meyers编造的一个术语,用于区分正常的右值引用,即
int&
和模板代码中的右值引用,即
T&
。这一点很重要,因为引用折叠规则与模板代码一起发挥作用,所以这个术语用于辅助教学。它之所以被称为
unversal引用
,是因为它可以绑定到任何东西


请记住,在C++语言中没有“代码>通用引用< /代码>这样的东西,就语言而言,代码>函数和& <代码>是<强> rValue> <强>。然而,是的,在Scott Meyer编造的术语中,
函数&&
在您的示例中是一个
通用参考

std::forward
在您的函数中调用时正确地转发参数类型。

+1这几乎就像我们在同一时间使用同一脚本键入。干得好。谢谢,+1也感谢你,因为我可能从阅读你的答案中学到了大部分。@StephenLin:继续用代码检查这些答案!我在这个问题上也是这样做的。当人们不用一点代码检查他们的答案时,这是令人恼火的。