20

A Brief Introduction to Rvalue References中,forward定义如下:

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

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

课程的目的是什么identity?为什么不:

  template <typename T>
  T &&forward(T &&a) { return a; }
4

1 回答 1

18

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

forward(a);     // compile-time error
forward<A>(a);  // ok

这是必要的原因是因为模板参数是客户端告诉编译器将参数作为左值或右值转发的开关。如果您不小心忘记提供此信息,则左值总是作为左值返回,而右值总是作为右值返回。虽然起初这听起来像是您想要的,但实际上并非如此。

template <class T, class A1>
std::shared_ptr<T>
factory(A1&& a1)
{
    return std::shared_ptr<T>(new T(std::forward<A1>(a1)));
}

在上面的例子a1中总是一个左值。但是“开关”A1可能是也可能不是左值引用。如果是左值引用,则a1作为左值返回,否则a1作为右值返回。如果 factory 的作者不小心忘记提供 A1,identity编译时的使用会提醒他。

注:终稿缺少identity,但remove_reference同处同用。

于 2011-04-01T12:56:58.420 回答