So che ci sono argomenti simili a questo già (come this).Poiché un valore letterale stringa è considerato un valore lvalue, perché il riferimento lvalue di associazione deve essere const?
L'esempio riportato in questo argomento è stato questo:
std::string & rs1 = std::string();
Chiaramente, che std :: string() è un rvalue. Tuttavia, la mia domanda è perché è legale s1 mentre s2 non è?
const std::string& s1 = "String literal";
std::string& s2 = "String literal";
La norma afferma chiaramente che le stringhe letterali sono lvalue (che è comprensibile dal momento che sono tecnicamente const char * dietro le quinte). Quando compilo S2, però, ottengo il seguente:
prog.cpp:4:19: error: invalid initialization of non-const reference of type
'std::string& {aka std::basic_string<char>&}' from an rvalue of type
'const char*' std::string& s2 = "String literal";
Capisco che la definizione standard di lvalue e rvalues si escludono a vicenda, in modo da questo potenzialmente un errore con il compilatore? Sto usando gcc 4.9.2 in questo esempio. Questo sarebbe anche uno dei casi in cui il letterale è davvero un valore x?
Poiché i riferimenti non costanti non possono essere associati ai provvisori. i riferimenti di const lvalues possono. Un oggetto temporaneo di tipo string viene creato da "const char *". Questo è legato al riferimento. – bolov
Sei sicuro che il tuo codice di esempio è quello che hai compilato? 'const std :: string & s2 =" String literal "' è totalmente valido, mentre, ovviamente 'std :: string & s1 =" String letteral "' non lo è. – mbgda
Modificato. Grazie per la risposta rapida. Mi sono appena accorto di aver copiato/incollato male. – elau