Lifetime of Temporaries Revisited
Das bereitgestellte Code-Snippet zeigt das faszinierende Verhalten temporärer Objekte in C. Bedenken Sie Folgendes:
std::string foo() { std::string out = something...; return out; } void bar(const char* ccp) { // Do something with the string... } bar(foo().c_str());
Es stellt sich die Frage: Warum ist der „c_str()“-Zeiger des von foo() zurückgegebenen Temporärs noch gültig? Der gesunde Menschenverstand könnte vorschlagen, dass die temporäre Datei zerstört werden sollte, bevor bar() aufgerufen wird. Dies ist jedoch nicht der Fall.
Gemäß dem C-Standard verlängert sich die Lebensdauer eines temporären Objekts, bis die Auswertung des vollständigen Ausdrucks, der lexikalisch den R-Wert enthält, der es erstellt hat, abgeschlossen ist. Dies bedeutet, dass im angegebenen Code das von foo() zurückgegebene temporäre Objekt am Leben bleibt, bis der Aufruf von bar() abgeschlossen ist.
Um dieses Konzept zu veranschaulichen, berücksichtigen Sie Folgendes:
____________________ full-expression ranges from 'b' to last ')' bar(foo().c_str()); ^^^^^ ^ | | birth funeral
Das temporäre Objekt wird erstellt, wenn foo() aufgerufen wird (bezeichnet als „Geburt“). Es bleibt während der gesamten Auswertung des vollständigen Ausdrucks aktiv, in diesem Fall der Funktionsaufruf bar(foo().c_str()). Sobald der Funktionsaufruf abgeschlossen ist, wird das temporäre Objekt zerstört (bezeichnet als „Beerdigung“).
Das obige ist der detaillierte Inhalt vonWarum bleibt „c_str()' einer temporären C-Zeichenfolge nach dem Funktionsaufruf gültig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!