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.
&sist 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 soder einen Zeiger auf möchten s, gehen Sie einfach vor.
string* const& valanstelle 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.