【问题标题】:Why use identity in forward definition for C++0x rvalue reference?为什么在 C++0x 右值引用的前向定义中使用标识?
【发布时间】:2011-04-01 12:05:06
【问题描述】:

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; }

【问题讨论】:

    标签: c++11 rvalue-reference


    【解决方案1】:

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

    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

    【讨论】:

    • 我认为这比我的回答更好解释,所以我删除了我的。我仍然想知道是否有一个很好的例子可以将右值参数传递给forward。有没有用例?也许在标准库中?
    • 参见open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2951.html 中的用例 B。请注意,本文提出了一种前向实现,但最终被发现存在问题。然而,最终的前向规范通过并正确地失败了本文中提出的所有用例。这是open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3143.html 的论文,它指出了 N2951 遗漏的最终用例。
    猜你喜欢
    • 2010-10-25
    • 2011-02-14
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多