【问题标题】:C++11 perfect forwarding and reference collapsingC++11完美转发和引用折叠
【发布时间】:2015-02-09 03:24:21
【问题描述】:

考虑这段代码:

template<typename T>
void foo(T&& param){ //In this case && is called universal reference
    std:string tmp = std::forward<string>(param);
}

我的问题是,如果可以推断出通用引用类型,为什么我还需要调用 forward ?
为什么不转发 tmp 的正确 c'tor 即使推导出了 T 的类型也不会被调用。

我的第二个问题是关于参考折叠规则:

  1. A&amp; &amp;&amp; 变为 A&amp;
  2. A&amp;&amp; &amp;&amp; 变为 A&amp;&amp;

所以根据这个规则并考虑到通用参考为什么 std::forward 签名不能如下:

template<class T> 
T&& forward(T&& arg){
    return static_cast<T&&>(arg);
}

根据上面的规则,如果T的类型是右值引用,它将折叠为右值引用,如果T的类型是左值引用,它将折叠为左值引用。
那么为什么std::forward 有两个不同的签名,一个用于左值引用,一个用于右值引用,我错过了什么吗?

【问题讨论】:

  • 现在它们被称为“转发引用”。
  • 什么是 T$$?那应该是T&&吗?

标签: c++ c++11 perfect-forwarding forwarding-reference


【解决方案1】:

我的问题是,如果可以推断出通用引用类型,为什么我还需要调用 forward ?

因为只要给参数param 命名,它就是一个左值,即使该函数是用右值调用的,所以它不会作为右值转发,除非你使用forward&lt;T&gt;

为什么不转发 tmp 的正确 c'tor 即使推导出 T 的类型也不会被调用。

因为param 是一个左值。要恢复传递给foo 的参数的值类别,您需要将其转换回string&amp;string&amp;&amp;,这意味着您需要知道T 被推断为的类型,并使用forward 来执行演员表。

那么为什么std::forward 有两个不同的签名,一个用于左值引用,一个用于右值引用,我错过了什么吗?

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3143.html改了

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3143.htmlhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2951.html有很多背景信息

您建议的版本的问题是,如果您说forward&lt;string&gt;,则不会推导出参数T,因此不能用作转发引用,这意味着T&amp;&amp; 无法绑定到左值,并且它需要能够绑定到一个左值才能使forward&lt;string&gt;(param) 工作,因为param 是一个左值。

【讨论】:

  • 根据您的回答,foo 的参数是一个左值,当您使用左值调用前向时,您会得到左值。那么这里如何保留右值类型呢?顺便说一句,根据 Scott Meyers foo 的签名,这意味着 param 是通用引用。
  • 右值在foo 的主体中丢失了,因为param 在那里是一个左值,但是你使用forward 恢复右值类型。
  • 现在它们被称为forwarding references,而不是通用引用。
  • 因此,如果 forward 设法“恢复”保存在 foo 正文中的正确类型的参数,为什么在我的示例中 tmp 的 c'tor 不能隐式执行相同的操作?
  • 因为你必须明确地告诉你希望它转换为的类型,即你必须调用forward&lt;T&gt;(param) 而不仅仅是forward(param)。那里的显式类型是explicit,不能隐式推导。如果您不使用 forward 来恢复右值,那么它就会丢失,它不能被另一个传递左值的函数恢复,它无法知道这是一个在堆栈上两级的右值。
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2011-04-05
  • 2015-09-07
  • 2015-04-11
相关资源
最近更新 更多