C++11 为什么在C+的正向定义中使用标识+;0x右值引用?

C++11 为什么在C+的正向定义中使用标识+;0x右值引用?,c++11,rvalue-reference,C++11,Rvalue Reference,在中,forward的定义如下: template <typename T> struct identity { typedef T type; }; template <typename T> T &&forward(typename identity<T>::type &&a) { return a; } identity的目的是使T不可推断。也就是说,在调用forward时强制客户端显式提供T forw

在中,
forward
的定义如下:

  template <typename T>
  struct identity { typedef T type; };

  template <typename T>
  T &&forward(typename identity<T>::type &&a) { return a; }

identity
的目的是使
T
不可推断。也就是说,在调用
forward
时强制客户端显式提供
T

forward(a);     // compile-time error
forward<A>(a);  // ok
转发(a);//编译时错误
转发(a);//好啊
之所以需要这样做,是因为模板参数是一个开关,客户机使用它告诉编译器将参数作为左值或右值转发。如果您不小心忘记提供此信息,那么左值总是作为左值返回,右值总是作为右值返回。虽然一开始这听起来像是你想要的,但事实并非如此

template <class T, class A1>
std::shared_ptr<T>
factory(A1&& a1)
{
    return std::shared_ptr<T>(new T(std::forward<A1>(a1)));
}
模板
std::共享的ptr
工厂(A1和A1)
{
返回std::shared_ptr(新的T(std::forward(a1));
}
在上面的示例中,
a1
始终是左值。但是“开关”
A1
可能是也可能不是左值引用。如果是左值引用,
a1
作为左值返回,否则
a1
作为右值返回。如果factory的作者不小心忘记提供A1,则使用
identity
会在编译时提醒他


注:最终草案缺少
标识
,但出于相同目的在同一位置使用了
删除参考

我认为这比我的答案解释得更好,因此我删除了我的答案。我仍然想知道是否有一个很好的例子,您可以将右值参数传递给
forward
。有任何用例吗?可能在标准库中?请参阅中的用例B。请注意,本文提出了一个最终被发现存在问题的前向实现。然而,最终的正向规范通过了本文中介绍的所有用例,并且正确地失败了。这篇文章指出了N2951遗漏的最终用例。
template <class T, class A1>
std::shared_ptr<T>
factory(A1&& a1)
{
    return std::shared_ptr<T>(new T(std::forward<A1>(a1)));
}