EDIT: Ich habe einige experimentiert und festgestellt, dass die Dinge etwas subtiler sind, als ich dachte. Ich denke jetzt, dass dies eine genaue Antwort ist.
&s
ist kein l-Wert, daher können Sie keinen Verweis darauf erstellen, es sei denn, der Typ des Verweises ist ein Verweis darauf const
. So können Sie zum Beispiel nicht tun
string * &r = &s;
aber du kannst es tun
string * const &r = &s;
Wenn Sie eine ähnliche Deklaration in den Funktionsheader einfügen, funktioniert dies.
void myfunc(string * const &a) { ... }
Es gibt noch ein anderes Problem, nämlich Provisorien. Die Regel ist, dass Sie nur dann einen Verweis auf eine temporäre Datei erhalten können, wenn dies der Fall ist const
. In diesem Fall könnte man also argumentieren, dass & s vorübergehend ist und daher deklariert werden mussconst
im Funktionsprototyp . Aus praktischer Sicht macht es in diesem Fall keinen Unterschied. (Es ist entweder ein r-Wert oder ein temporärer Wert. In beiden Fällen gilt die gleiche Regel.) Genau genommen denke ich jedoch, dass es kein temporärer, sondern ein r-Wert ist. Ich frage mich, ob es einen Weg gibt, zwischen den beiden zu unterscheiden. (Vielleicht wird einfach definiert, dass alle Provisorien r-Werte sind und alle Nicht-l-Werte temporäre Werte. Ich bin kein Experte für den Standard.)
Davon abgesehen liegt Ihr Problem wahrscheinlich auf einem höheren Niveau. Warum möchten Sie einen Verweis auf die Adresse von s
? Wenn Sie einen Verweis auf einen Zeiger auf möchten s
, müssen Sie einen Zeiger wie in definieren
string *p = &s;
myfunc(p);
Wenn Sie einen Verweis auf s
oder einen Zeiger auf möchten s
, gehen Sie einfach vor.
string* const& val
anstelle eines weniger lesbaren Äquivalents wie zconst string* &val
. Für meine Augen ist dies eindeutig eine konstante Referenz , auf einen Zeiger, auf eine Zeichenfolge. Ich persönlich schreibeT const&
lieber alsconst T&
in Erklärungen, um genau diese Klarstellung zu erhalten.