Cominciamo rompendo questo in due pezzi, in modo che possiamo analizzare ogni parte:
#include <string>
void foo()
{
auto x = std::move("");
std::string s(x);
}
La seconda parte, che inizializza la stringa da x
(qualunque sia il tipo che potrebbe capitare di essere) non è davvero il problema o la domanda a portata di mano qui. La domanda in questione (almeno come mi sembra) è la prima riga, in cui cerchiamo di associare un riferimento di rvalue a una stringa letterale.
La parte rilevante dello standard per questo sarebbe [dcl.init.ref]/5
(§8.5.3/5, almeno nella maggior parte delle versioni dello standard C++ che ho visto).
Questo inizia con:
A reference to type ''cv1 T1'' is initialized by an expression of type ''cv2 T2'' as follows.
che è seguita da un elenco puntato. Il primo elemento copre solo i riferimenti lvalue, quindi lo ignoreremo. Il secondo elemento dice:
if the initializer expression
- is an xvalue (but not a bit-field) class prvalue, array prvalue or function lvalue[...]
- has class type (i.e., T2
is a class type)[...]
- Otherwise - if T1
or T2
is a class type and T1 is not is not reference related to T2 [...]
Chiaramente nessuno di questi si applica. Una stringa letterale non è un valore x, un valore di classe, un valore di matrice o un valore di funzione, né ha un tipo di classe.
Ciò lascia solo:
If T1
is reference-related to T2
:
- cv1 shall be the same cv-qualification as, or greater cv-qualification than, cv2, and
- if the reference is an rvalue reference, the initializer expression shall not be an lvalue.
Poiché, in questo caso, il tipo del risultato della conversione viene dedotto dal compilatore, esso sarà essere riferimento relativi alla tipologia del inizializzatore. In questo caso, come dice la parte che ho enfatizzato, l'espressione di inizializzazione non può essere un lvalue.
Ciò lascia solo la questione se una stringa letterale è un lvalue. Almeno alla fine, non riesco a trovare immediatamente la sezione dello standard C++ che dice di esserlo (non ne parliamo nella sezione sui letterali stringa). Se è assente, il passo successivo sarebbe quello di guardare il documento di base (lo standard C) in cui si afferma chiaramente che le stringhe letterali sono lvalue (N1570, §6.5.1/4)
A string literal is a primary expression. It is an lvalue with type as detailed in 6.4.5.
Io vorrei poter trova una dichiarazione diretta in tal senso nello standard C++ (sono abbastanza sicuro che dovrebbe esistere), ma per qualche ragione non lo sto trovando proprio ora.
Compila anche su [g ++ 5.2.0] (http://coliru.stacked-crooked.com/a/5547385a86e74d19). La mia scommessa è che Visual Studio è sbagliato, dato che di solito è ... – Claudiu
Penso che tu abbia riassunto tutto bene nella tua domanda. MSVC è sbagliato, non è la prima volta. – SergeyA
Che errore produce MSVC, in particolare? – edmz