std::forward
съществува поради странност в начина, по който &&
работи при дедукция на типа.
При дедукция на типа, T
в T&&
ще се свърже с една от 3 възможности. Ако се изведе от lvalue int&
, T
ще се свърже с int&
. Тогава int& &&
е просто int&
. Ако се изведе от lvalue int const&
, T
ще се свърже с int const&
, а int const& &&
е int const&
. Ако се изведе от rvalue int
от някакъв вид, T
ще се свърже с int
, а int&&
е int&&
.
std::forward
е помощна функция за обръщане на тази карта. Трите уместни подписа на std::forward<>
са: T& std::forward<T&>(T&)
или T const& std::forward<T const&>(T const&)
или T&& std::forward<T>(T&&)
Всичко това в крайна сметка се оказва изключително полезно, когато изпълнявате техниката, известна като „перфектно препращане“, където използвате T&&t
в контекст на извеждане на типа, след това std::forward<T>(t)
, за да предадете „същия тип“, от който е изведен, към друго повикване.
Имайте предвид, че има няколко опростяващи лъжи по-горе. Съществува и възможност за T const&&
, което е доста неясно като тип, като пример. Вероятно съм премълчал някои подробности за това как работи дедукцията на типа и термините rvalue
и lvalue
не отразяват напълно пълните 5-кратни (или 6?) различни видове стойности на променливи в C++11.
person
Yakk - Adam Nevraumont
schedule
15.04.2013