【问题标题】:Can a defaulted template type be universal reference?默认模板类型可以是通用引用吗?
【发布时间】:2013-03-03 02:14:17
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    universal reference 一词是 Scott Meyers 为区分普通右值引用(即int&amp;&amp;)和模板代码中的右值引用(即T&amp;&amp;)而编造的一个术语。这很重要,因为参考折叠规则与模板代码一起发挥作用,因此该术语用于帮助教学。之所以称为unversal reference,是因为它可以绑定到任何东西。

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

    【讨论】:

    • +1 这几乎就像我们在同一时间从同一个脚本中打字一样。干得好。
    • 谢谢,也对你 +1,因为我可能大部分都是从阅读你关于 SO 的答案中学到的。
    • @StephenLin:继续用代码检查这些答案!这个问题我也这样做了。当人们不使用一点代码检查他们的答案时,这很烦人。
    【解决方案2】:

    && 是通用参考吗?

    有点。就像复活节兔子和圣诞老人​​一样,实际上没有通用参考这样的东西(对不起,如果我为你破坏了它)。 通用参考这个词没有出现在标准中。这是 Scott Meyers 创造的术语,用于描述“特殊扣除规则”处于活动状态时的模板化右值引用。

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

    【讨论】:

      【解决方案3】:

      Looks like it, std::forward&lt;Function&gt; 在您的函数中调用时正确转发参数类型。

      【讨论】:

        猜你喜欢
        • 2014-11-06
        • 1970-01-01
        • 2020-01-09
        • 1970-01-01
        • 2019-09-23
        • 2012-10-25
        • 1970-01-01
        • 2012-04-14
        • 1970-01-01
        相关资源
        最近更新 更多