Quando ho un codice che è simile al seguente:Perfetto inoltro e modelli
template<class T>
void f_(const T& arg)
{
cout << "void f(const T& arg): Cannot modify\n";
}
template<class T>
void f_(T&& arg)
{
cout << "void f(T&& arg): Can modify\n";
}
e principale per cui ho chiamarlo:
int main()
{
MemoryBlock block;
f_(block);
f_(MemoryBlock());
return 0;
}
L'output è:
"void f (T & & arg): Può modificare \ n ";
"void f (T & & arg): Può modificare \ n";
Ma quando cambio questo codice per non generico, cioè invece di modelli di funzione avrò funzioni regolari,
void f(const MemoryBlock&)
{
cout << "In f(const MemoryBlock&). This version cannot modify the parameter.\n";
}
void f(MemoryBlock&&)
{
cout << "In f(MemoryBlock&&). This version can modify the parameter.\n";
}
l'uscita è più "intuitivo":
"In f (const MemoryBlock &). Questa versione non può modificare il parametro. ";
"In f (MemoryBlock & &). Questa versione può modificare il parametro.";
Mi sembra che solo cambiando le funzioni da modelli a non modelli cambia totalmente le regole di detrazione per i riferimenti di valore.
Sarà davvero buono se qualcuno me lo spiegasse.
tuo indurre in errore pensando che il parametro template ' T' esegue il mapping a 'MemoryBlock'. – Walter
È interessante che tu abbia un "inoltro perfetto" nel titolo, ma non esegui alcun inoltro. – Mehrdad