Diamo una funzione chiamata Y che sovraccarica:Perché std :: forward restituisce static_cast <T&&> e non statico_cast <T>?
void Y(int& lvalue)
{ cout << "lvalue!" << endl; }
void Y(int&& rvalue)
{ cout << "rvalue!" << endl; }
Ora, definiamo una funzione template che si comporta come std :: avanti
template<class T>
void f(T&& x)
{
Y(static_cast<T&&>(x)); // Using static_cast<T&&>(x) like in std::forward
}
Ora guardate la main()
int main()
{
int i = 10;
f(i); // lvalue >> T = int&
f(10); // rvalue >> T = int&&
}
Come previsto, l'output è
lvalue!
rvalue!
Ora tornare alla funzione modello f()
e sostituire static_cast<T&&>(x)
con static_cast<T>(x)
. Vediamo l'output:
lvalue!
rvalue!
È lo stesso! Perché? Se sono uguali, allora perché std::forward<>
restituisce un cast da x
a T&&
?
Spiegherete perché la copia si verifica in un static_cast? – gedamial
La categoria del valore non è la stessa. La categoria di valore * gruppo * è la stessa ("valore_valore"), ma le categorie di valori differiscono (valore vs valore x). –
@gedamial: che altro avrebbe fatto? Quando converti un 'T1' in un' T2', i dati vengono copiati (tramite trasformazione) in un nuovo oggetto. Questo può essere evitato solo con i tipi di riferimento .... ([o, per 'typeid (T1) == typeid (T2)', utilizzando Visual Studio nella sua riduttiva modalità predefinita non conforme] (http: // stackoverflow. COM/a/37969300/560648)). –