Associazione temporanea a un riferimento lvalue
-
20-09-2019 - |
Domanda
Ho il codice seguente
string three()
{
return "three";
}
void mutate(string& ref)
{
}
int main()
{
mutate(three());
return 0;
}
Puoi vedere che sto passando tre() A mutare metodo.Questo codice viene compilato bene.La mia comprensione è che i temporanei non possono essere assegnati a riferimenti non costanti.Se sì, come viene compilato questo programma?
qualche idea?
Modificare:
I compilatori hanno provato:VS2008 e VS2010 Beta
Soluzione
Si compilava nel compilatore VC6, quindi suppongo che per mantenere la compatibilità con le versioni precedenti VS2008 supporti questa estensione non standard.Prova con /Za (disabilita estensione lingua), dovresti ricevere un errore.
Altri suggerimenti
È l'estensione malvagia di VC++.Se compili con /W4 il compilatore ti avviserà.Immagino che tu stia leggendo il Riferimenti Rvalue:Funzionalità di C++0x in VC10, parte 2.Anche questo articolo aveva menzionato questo problema.
Questa è un'estensione Microsoft, per imitare il comportamento di molti altri compilatori Microsoft.Se abiliti gli avvisi W4, vedrai l'avviso.
Esso no compilare, almeno con g++ 4:
foo.cpp: In function ‘int main()’:
foo.cpp:16: error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’
foo.cpp:10: error: in passing argument 1 of ‘void mutate(std::string&)’
(I numeri di riga sono sfasati di 3 o 4, perché ho dovuto aggiungere le righe #include e 'using'.)
Quindi, il tuo compilatore sembra non essere così rigoroso come dovrebbe essere.
Immagino che dipenda dal compilatore.g++ 4.1.2 mi dà questo.
In function 'int main()':
Line 15: error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string'
compilation terminated due to -Wfatal-errors.
Forse perché non stai facendo nulla la chiamata viene ottimizzata.