Я экспериментирую с Perfect Forwarding и обнаружил, что std::forward()
требуется две перегрузки:
Номер перегрузки.1:
template <typename T>
inline T&& forward(typename
std::remove_reference<T>::type& t) noexcept
{
return static_cast<T&&>(t);
}
Номер перегрузки 2:
template <typename T>
inline T&& forward(typename
std::remove_reference<T>::type&& t) noexcept
{
static_assert(!std::is_lvalue_reference<T>::value,
"Can not forward an rvalue as an lvalue.");
return static_cast<T&&>(t);
}
Теперь типичный сценарий для совершенной пересылки выглядит примерно так:
template <typename T>
void wrapper(T&& e)
{
wrapped(forward<T>(e));
}
Конечно, вы знаете, что когдаwrapper()
создается, T
зависит от того, является ли переданный ему аргумент lvalue или rvalue.Если это lvalue типа U
, T
выводится в U&
.Если это значение r, T
выводится в U
.
В любом случае - в области действия wrapper()
- e
- lvalue, поэтому всегда используется первая перегрузка std::forward()
.
Теперь мой вопрос:
Каков допустимый сценарий, в котором используется (и необходима) 2-я перегрузка?