Ich weiß, dass es bereits ähnliche Themen gibt (z. B. this).Da ein String-Literal als Lvalue gilt, warum muss der Binding-Lvalue-Bezug const sein?
Das Beispiel in diesem Thema gegeben war:
std::string & rs1 = std::string();
ist klar, dass std :: string() ist ein R-Wert. Aber meine Frage ist, warum ist S1 legal, während S2 nicht ist?
const std::string& s1 = "String literal";
std::string& s2 = "String literal";
Der Standard stellt klar, dass Stringliterale lvalues sind (die, da sie hinter den Kulissen technisch const char sind verständlich ist *). Wenn ich kompilieren obwohl s2, erhalte ich folgendes:
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";
Ich verstehe, dass die Standard-Definition von lvalues und rvalues gegenseitig ausschließen, so ist dies möglicherweise ein Fehler mit dem Compiler? Ich verwende gcc 4.9.2 in diesem Beispiel. Wäre dies auch einer der Fälle, in denen das Literal wirklich ein xvalue ist?
Da nicht-konstante Lvalue-Referenzen nicht an Provisorien binden können. Const Lvalues Referenzen können. Ein temporäres Objekt vom Typ string wird aus "const char *" erstellt. Dies ist an die Referenz gebunden. – bolov
Sind Sie sicher, dass Ihr Beispielcode das ist, was Sie kompiliert haben? 'const std :: string & s2 =" String literal "' ist absolut gültig, während 'std :: string & s1 =" String literal "' nicht zutrifft. – mbgda
Editiert es. Danke für die schnelle Antwort. Ich habe gerade realisiert, dass ich falsch kopiert habe. – elau