Okres pracy tymczasowej

Poniższy kod działa dobrze, ale dlaczego jest to poprawny kod? Dlaczego wskaźnik" c_str () " tymczasowego zwracanego przez foo() jest ważny? Myślałem, że ta tymczasowa jest już zniszczona po wpisaniu bar () - ale tak nie wygląda. Więc teraz zakładam, że tymczasowe zwracane przez foo() zostanie zniszczone po wywołaniu do bar () - czy to prawda? I dlaczego?

std::string foo() {
  std::string out = something...;
  return out;
}

void bar( const char* ccp ) {
  // do something with the string..
}

bar( foo().c_str() );
Author: fredoverflow, 2010-11-18

2 answers

$12.2/3- "obiektami tymczasowymi są zniszczony jako ostatni krok w ocena pełnego wyrażenia (1.9) które (leksykalnie) zawiera punkt gdzie zostały stworzone. To prawda. nawet jeśli ocena ta kończy się rzucanie WYJĄTKÓW."

Czas życia tymczasowego zwracanego przez foo() rozciąga się do końca pełnego wyrażenia, w którym zostało utworzone, tzn. do końca wywołania funkcji 'bar'.

EDIT 2:

$1.9/12- "pełne wyrażenie jest wyrażenie, które nie jest podwyrażeniem innego wyrażenia. Jeśli język construct jest zdefiniowany w celu wytworzenia implicit call of a function, a use of za konstrukcję języka uważa się być wyrażeniem dla celów tej definicji."

 44
Author: Chubsdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-18 11:28:43

Obiekt tymczasowy jest niszczony, gdy pełne wyrażenie, które leksykalnie zawiera wartość R, której ewaluacja utworzyła ten obiekt tymczasowy, jest całkowicie ewaluowane. Pozwól, że zademonstruję z ASCII art:

____________________   full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
     ^^^^^          ^
       |            |
     birth       funeral
 63
Author: fredoverflow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-18 11:21:55