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

时间:2013-03-03 02:14:18

标签: c++ templates c++11 reference universal-reference

在下文中,&&是一个通用引用吗?

template <class Function = std::greater<int> > void f(Function&& f = Function());

3 个答案:

答案 0 :(得分:7)

术语universal reference是Scott Meyers用的术语,用于区分正常的右值引用,即int&&和模板代码中的右值引用,即T&&。这很重要,因为参考折叠规则与模板代码一起发挥作用,因此该术语用于辅助教学。它被称为unversal reference的原因是因为它可以绑定到任何东西。

请记住,在C ++语言中没有universal reference这样的东西,就语言而言,Function&&右值引用。但是,是的,在Scott Meyer编写的术语中,Function&&在您的示例中是universal reference

答案 1 :(得分:3)

  

是&amp;&amp;普遍参考?

排序。像复活节兔子和圣诞老人​​一样,实际上没有通用引用(对不起,如果我为你破坏了它)。术语通用引用未显示在标准中。这是Scott Meyers创造的术语,用于描述“特殊演绎规则”有效时模板化的右值参考。

您展示的内容有效代码。在这种情况下,特殊扣除规则也适用。也就是说,当您将左值参数A传递给f时,Function将推导为A&。所以按照Scott的定义,是的,Function是一个“通用参考”。

答案 2 :(得分:1)

Looks like itstd::forward<Function>在您的函数中调用时正确转发参数类型。