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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top