我正在阅读新 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(使用前将#替换为@)