std::forward 的实现

2024-04-29

我正在阅读新 C++ 概述 (C++11/14)(仅限 PDF) http://www.artima.com/shop/overview_of_the_new_cpp,在幻灯片 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);
}

有什么不同?为什么后者是通常的实现方式?


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

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

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

Edit:该标准实际上要求一个与此等效的签名(顺便说一句,这正是 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::forward 的实现 的相关文章

随机推荐