Ist der folgende Code sicher, oder könnte m_s
nach der Konstruktion C
eine unverbindliche Referenz sein?Sicher gespeichertes Objekt in Mitgliedsreferenz speichern?
class C {
public:
C(string&& s) : m_s{s} {}
private:
string& m_s;
};
Ist der folgende Code sicher, oder könnte m_s
nach der Konstruktion C
eine unverbindliche Referenz sein?Sicher gespeichertes Objekt in Mitgliedsreferenz speichern?
class C {
public:
C(string&& s) : m_s{s} {}
private:
string& m_s;
};
Nein es nicht sicher ist, sollten Sie das folgende Beispiel:
C c(std::string("42"));
, wo Sie einen temporären in den Konstruktor übergeben. Auf diese Weise erstellen Sie eine freie Referenz.
Nein, es ist nicht sicher. Auch Member Const Referenzen verlängern nicht die Lebensdauer eines temporären (also auch keine Option). Was sollten Sie tun, stattdessen bewegt Wert aus Ihrem temporären konstruieren zu „absorbieren“, die in Ihre Klasse:
class C {
public:
C(string&& s) : m_s{std::move(s)} {}
private:
string m_s;
};
Would machen 'm_s' ein' const string & 'macht es sicher? Ich weiß, dass es verschiedene Regeln für die Lebensdauerverlängerung gibt, wenn es um Referenzen und Const-Referenzen geht. – Danra
@Danra nein würde es nicht. Es würde weiterhin eine unentschiedene Referenz sein, auch wenn es sich um eine qualifizierte Quelle handelt. – 101010
Aus Neugier, gibt es irgendeine Situation, in der der ursprüngliche Code * nicht * eine freie Referenz erzeugen würde? – Danra