Die Implementierung von std::forward

Bin ich beim Lesen Überblick über die Neue C++ (C++11/14) (nur PDF), mit Folie 288 es gibt eine Implementierung von 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.
}

... Und gibt dann anderen die Implementierung im text:

Den üblichen std::forward-Implementierung:

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); }

Was ist der Unterschied? Warum ist letzteres der üblichen Umsetzung?

  • Im ersten Fall, Sie bekommen konnte Weg mit std::forward(x), aber in der zweiten, müssen Sie explizit den template-Parameter, da Sie nicht entnommen werden kann.
  • Nein, tun Sie nicht. Warum wäre das notwendig? Referenz einstürzenden arbeiten außerhalb des unmittelbaren Weiterleitung Referenzrahmen.
  • verpasst, es ist Identität, nicht remove_reference
  • Du hast Recht, lvalues müssen akzeptiert werden. Allerdings rvalues nicht benötigen, so ist die Lösung nicht eine zweite überladung, die Lösung ist immer eine lvalue-Referenz in der einen, die da ist.
  • Stellt sich heraus, ich bin falsch, der standard erfordert rvalues akzeptiert zu werden.
InformationsquelleAutor songyuanyao | 2014-12-16
Schreibe einen Kommentar