Il dovrebbe essere un rvalue ma Webcompiler esegue Visual Studio e Visual Studio ha un extension which allows temporary objects to be bound to non-const lvalue references.a bug/extension that casues it to generate an lvalue in this case Come indicato sopra, Igor può essere disabilitato utilizzando /Za
(see it live).
Possiamo vedere che dovrebbe essere un rvalue (specificamente un prvalue) dal progetto C++ sezione standard 5.4
tipo di conversione esplicita (notazione cast) paragrafo che dice (sottolineatura mia) :
il risultato dell'espressione (T) Cast-espressione è di tipo T. il risultato è un lvalue se T è un tipo di riferimento lvalue o un rvalue riferimento al tipo di funzione e un valore x se T è un riferimento di valore al tipo di oggetto; altrimenti il risultato è un valore nominale. [Nota: se T è un tipo non di classe qualificato cv, i qualificatori cv vengono ignorati quando si determina il tipo del valore risultante; vedi 3.10. -end nota]
Sia gcc e clang risultato nella rvalue che è il risultato atteso.
Per inciso, consiglierei di utilizzare rextester su webcompiler poiché rextester consente di condividere il programma e ha anche condivisione dal vivo.
Aggiornamento
Ben Voigt sottolineare questo bug report e così sembra che Visual Studio in realtà produce un lvalue . Quindi questo non è semplicemente un caso di extension which allows temporary objects to be bound to non-const lvalue references.
Come dyp indica anche gcc used to have a cast to lvalue extension.
Update 2
Mgetz ha presentato una bug report, la risposta è stata che questo viene fissato usando il /Zc:rvalueCast flag, la descrizione della bandiera è la seguente:
Quando l'/ Zc: rvalueCast l'opzione è specificata, il compilatore correttamente identifica un tipo di riferimento di rvalore come risultato di un'operazione di cast in conformità con lo standard C++ 11. Se l'opzione non è specificata , il comportamento del compilatore è lo stesso di Visual Studio 2012. Per impostazione predefinita,/Zc: rvalueCast è disattivato. Per la conformità e per eliminare gli errori nell'uso dei cast, si consiglia di utilizzare/Zc: rvalueCast.
Non è chiaro se questo flag sarà abilitato per impostazione predefinita nelle versioni future.
fonte
2014-10-22 13:35:07
Qualcuno ha controllato per vedere se c'è ancora un bug [connect] (http://connect.microsoft.com)? Una ricerca rapida non ne ha risolti uno. – Mgetz
@Mgetz Stavo cercando, non ho trovato nulla di ovvio però. –
[Archiviato come difetto alla connessione] (https://connect.microsoft.com/VisualStudio/feedback/details/1008261) contro VS2013 utilizzando il test case di @ ShafikYaghmour – Mgetz