Voi*_*oid 5 c++ perfect-forwarding c++11
据我所知,这个解释如何std::forward工作http://thbecker.net/articles/rvalue_references/section_08.html我们只能省去一个版本std::forward:
template<class S>
S&& forward(typename remove_reference<S>::type& a) noexcept
Run Code Online (Sandbox Code Playgroud)
但实际上,我们有(http://en.cppreference.com/w/cpp/utility/forward)第二版:
template< class T >
T&& forward( typename std::remove_reference<T>::type&& t );
Run Code Online (Sandbox Code Playgroud)
这与前一个不同之处仅在于如何t定义(带&&)
那么,为什么我们需要呢?如果删除它会破坏什么?
std::forward重载的参数(使用std::remove_reference)删除了否则会发生的任何引用折叠和参数推导,并强制左值和右值引用绑定到正确的重载。这也是在不添加或删除任何可能const是(或不是)原始参数的一部分的情况下完成的T(即我们不使用 aconst T&因为它本质上const向不使用的右值添加了 a T&&,但它们都可以绑定到相同的右值)。
甲键错误检查完成在右值引用过载; 这是一个健全性检查,以确保std::forward在提供右值时不会调用转发到左值引用;基本上确保代码std::forward<int&>(42);无法编译。std::forward旨在用于公式中std::forward<T>,其中T来自参考文献中T&&指出的推断上下文。重载的结果与具有所需错误检查的条件返回相同。
的实现std::forward面向 Scott Meyers 在他的Going Native 2013演讲中谈到的“条件转换” 。Scott Meyers 在他的演讲中给出了以下伪代码来解释std::forward(大约 20 分钟)的工作原理;
template <typename T>
T&& forward(T&& param) { // T&& here is formulated to disallow type deduction
if (is_lvalue_reference<T>::value) {
return param; // return type T&& collapses to T& in this case
}
else {
return move(param); // return type is T&&
}
}
Run Code Online (Sandbox Code Playgroud)
std::forward如果其参数类型是左值,则实现为返回左值引用,如果std::move其参数类型是右值,则实现为返回右值引用(等价于)。
TL;DR 为什么需要它?基本上; 它可以防止错误使用std::forward(例如悬空引用、对不再可用的临时对象的引用、修改/修改文字等)。