Ist die Verwendung des temporären Objekts als Standardargument in C ++ sicher?

8

Zum Beispiel:

%Vor%

Aktualisieren

Die Schlussfolgerung von SoapBox ist richtig, aber der Grund ist nicht völlig richtig.

  

Die Lebensdauer des Temporären wird automatisch auf die selbe verlängert   als die Referenz, die es hält.

Dies trifft normalerweise mit einigen Ausnahmen zu. Einer ist das

  

"Eine temporäre Bindung an einen Referenzparameter in einem Funktionsaufruf   bleibt bestehen bis zur Vollendung des Volltexts, der das enthält   ruf an. "

Ich denke, diese Ausnahme gilt für den Standardargumentfall.

Eine weitere Ausnahme bezieht sich auf das zusätzliche Beispiel in der SoapBox-Antwort:

  

"Die Lebensdauer einer temporären Bindung an den zurückgegebenen Wert in einer Funktion   return-Anweisung wird nicht erweitert; Das Temporäre ist zerstört am   Ende des vollständigen Ausdrucks in der return-Anweisung. "

    
updogliu 20.07.2012, 01:01
quelle

3 Antworten

5

Ja, beides ist sicher. Sie konstruieren temporäre Objekte, und die Lebensdauer des temporären Objekts wird automatisch so erweitert, dass sie der Referenz entsprechen, die es enthält.

Obwohl wir gerade bei diesem Thema sind, ist dies ein häufiger Fehler bei Provisorien, der nicht sicher ist.

%Vor%

Dies ist ungültig, weil das temporäre Objekt in der accessor -Funktion erstellt und dann eine Referenz zurückgegeben wird. Der Aufrufer erhält eine Referenz auf ein zerstörtes Objekt ..., das ein nicht definiertes Verhalten ist und normalerweise einen Absturz verursacht.

    
SoapBox 20.07.2012, 01:07
quelle
3

Die Antwort von SoapBox ist richtig, aber es ist nicht immer klar, was die Einschränkungen sind.

  

Dies trifft normalerweise mit einigen Ausnahmen zu. Eine ist, dass "eine temporäre Bindung an einen Referenzparameter in einem Funktionsaufruf bis zum Abschluss des vollständigen Ausdrucks, der den Aufruf enthält, bestehen bleibt." Ich denke, diese Ausnahme gilt für den Standardargumentfall.

Es gilt, obwohl manchmal auf subtile Weise, diese zwei Beispiele:

%Vor%

In beiden Beispielen ist die Funktion ein Konstruktor.

  • In A : Die Lebensdauer des temporären Objekts wird verlängert, bis das Ende des vollständigen Ausdrucks bedeutet, dass A a("Hello"); std::cout << a._ref << "\n"; nicht sicher ist. Das Temporäre lebte nur bis zum ersten ; .
  • In B : Der Parameter selbst ist temporär, und hier gibt es keine Bindung an const-reference . Ein guter Compiler warnt jedoch.
  

Eine weitere Ausnahme bezieht sich auf das zusätzliche Beispiel in der SoapBox-Antwort: "Die Lebensdauer einer temporären Bindung an den zurückgegebenen Wert in einer Funktion return-Anweisung wird nicht verlängert; die temporäre wird am Ende des vollständigen Ausdrucks in der Rückgabe zerstört Aussage. "

Dies ergibt sich aus der Art, wie die return -Anweisung im Allgemeinen funktioniert. Es gibt darunter zwei Exemplare, soweit es den Standard betrifft. Das ist:

  1. Durch Aufruf von return wird das Ergebnis in den "Ergebnisslot"
  2. kopiert
  3. Der Aufrufer kopiert den Wert im "Ergebnisslot" in seinen Speicher, falls vorhanden.

Natürlich können Kopien auch wegkopiert werden (copy elision), aber das ist wichtig, weil die Lebensdauer des temporären nur bis zur ursprünglichen const-Referenz verlängert wird, an die es gebunden war. Wenn eine Kopie dieser Referenz die Lebensdauer des Originals überschreitet, bezieht sich dies auf den Wert "Müll", und das ist der Fall bei einer return -Anweisung.

    
Matthieu M. 20.07.2012 06:57
quelle
-3

Ja. Die Zeichenfolge wird als statischer Text zugewiesen und wird nicht verschoben oder geändert.

    
Charlie Martin 20.07.2012 01:06
quelle

Tags und Links