std::forward 的实现

新手上路,请多包涵

我正在阅读 新 C++ (C++1114) 概述(仅限 PDF) ,在幻灯片 288 中,它提供了 std::forward 的实现:

 template<typename T>                // For lvalues (T is T&),
T&& std::forward(T&& param)         // take/return lvalue refs.
{                                   // For rvalues (T is T),
    return static_cast<T&&>(param); // take/return rvalue refs.
}

然后在文本中给出另一个实现:

通常的 std::forward 实现是:

 template<typename T>
struct identity {
    typedef T type;
};
template<typename T>
T&& forward(typename identity<T>::type&& param)
{
    return static_cast<identity<T>::type&&>(param);
}

有什么区别?为什么后者是通常的实施方式?

原文由 songyuanyao 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 526
1 个回答

第一个的问题是你可以写 std::forward(x) ,它不会做你想要的,因为它总是产生左值引用。

第二种情况的参数是非推导上下文,防止模板参数的自动推导。这迫使您编写 std::forward<T>(x) ,这是正确的做法。

此外,第二个重载的参数类型应该是 typename identity<T>::type& 因为惯用 std::forward 的输入总是一个左值。

编辑: 该标准实际上要求一个与此等效的签名(顺便说一句,这正是 libc++ 所拥有的):

 template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept;
template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept;

原文由 Sebastian Redl 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题