Время жизни

Следующий код работает нормально, но почему этот правильный код? Почему указатель "c_str()" временного значения, возвращаемого функцией foo(), действителен? Я подумал, что это временное уже уничтожено, когда введен bar(), но похоже, что это не так. Итак, теперь я предполагаю, что временный объект, возвращенный foo(), будет уничтожен после вызова bar() - это правильно? И почему?

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

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

bar( foo().c_str() );

Ответ 1

$12.2/3- "Временные объекты разрушен как последний шаг в оценивая полное выражение (1.9) что (лексически) содержит точку где они были созданы. Это правда даже если эта оценка заканчивается выбрасывая исключение".

Время жизни временного объекта, возвращаемого функцией foo(), продолжается до конца полного выражения там, где оно создано, то есть до конца функции вызывать "бар".

ИЗМЕНИТЬ 2:

$1.9/12- "Полное выражение выражение, которое не является подвыражением другого выражения. Если язык конструкция определена для получения неявный вызов функции, использование рассматривается конструкция языка быть выражением для целей этого определения."

Ответ 2

Временной объект уничтожается, когда полное выражение, которое лексически содержит rvalue, оценка которого создала этот временный объект, полностью оценивается. Позвольте мне продемонстрировать с помощью искусства ASCII:

____________________   full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
     ^^^^^          ^
       |            |
     birth       funeral