【问题标题】:Is there a difference between universal references and forwarding references?通用引用和转发引用之间有区别吗?
【发布时间】:2017-01-25 21:49:55
【问题描述】:

此函数的参数将绑定到右值引用:

void f(int && i);

但是,此函数的参数将绑定到右值或左值引用:

template <typename T>  
void f(T && t);

我经常听说这被称为通用参考。
我还听说它被称为转发参考。
他们的意思是一样的吗?
如果函数体调用std::forward,是否只是转发引用?

【问题讨论】:

标签: c++ templates perfect-forwarding universal-reference forwarding-reference


【解决方案1】:

它们的意思是一样的吗?

Universal reference 是 Scott Meyers 创造的一个术语,用于描述将右值引用应用于 cv 非限定模板参数的概念,然后可以将其推断为值或左值引用。

当时 C++ 标准对此没有专门的术语,这是 C++11 中的一个疏忽,因此很难教授。 N4164 纠正了这一疏忽,将以下定义添加到 [temp.deduct]

转发引用是对 cv 非限定模板参数的右值引用。如果P是转发引用且参数是左值,则使用类型“对A的左值引用”代替A进行类型推导。

因此,两者的含义相同,当前的 C++ 标准术语是转发引用。论文本身阐明了为什么“转发参考”比“通用参考”更好。

函数体调用std::forward是否只是转发引用?

不,您对转发引用所做的操作与名称无关。概念转发引用只是指T这个类型是如何推导出来的:

template <class T> void foo(T&& ); // <== 

不需要后续转发。

【讨论】:

  • 不错的答案!您是否有任何(非平凡的)示例,您不会在转发引用上调用std::forward?您还可以提及局部变量的 auto&amp;&amp; 案例。
  • @vsoftco template &lt;class F&gt; void foo(F&amp;&amp; arg) { use(arg); use_again(arg); consume(std::forward&lt;F&gt;(arg)); }
  • 不言自明,谢谢,虽然你最终还是得到了前锋 :)
  • @vsoftco std::shuffle,例如。
  • @T.C.谢谢!你能解释为什么它没有转发吗?所以你不会“意外”最终移动RNG?但是为什么要通过转发 ref 传递呢?也许我应该把这个作为一个新问题来问......
【解决方案2】:

不幸的是,这令人困惑,但它们只不过是同一事物的两个名称。
Meyers 很久以前就提出了通用参考(我猜)(参见here 作为示例)。
转发参考是直接从 standardese 中提取的。就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2018-08-02
    • 2021-04-22
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多