Perfect forwarding
Passare gli argomenti a un'altra funzione senza perdere l'informazione su quali fossero temporanei. Ciò che permette di scrivere make_unique ed emplace_back.
Un wrapper che riceve gli argomenti come normali riferimenti perde l'informazione sulla categoria di valore: dentro la funzione tutto appare come un oggetto con nome, per cui un temporaneo che andrebbe spostato viene invece copiato. La soluzione è il pattern template<class... A> void f(A&&... a) { g(std::forward<A>(a)...); }. La doppia «&» qui non indica un riferimento rvalue ma un forwarding reference, perché il tipo è dedotto: le regole di reference collapsing lo fanno legare sia a temporanei sia a oggetti con nome, preservando la distinzione nel tipo dedotto. std::forward è poi un cast condizionale che ripristina la categoria originale. Senza di esso il pattern non serve a nulla.