Время жизни временных - PullRequest
       26

Время жизни временных

37 голосов
/ 18 ноября 2010

Следующий код работает нормально, но почему этот правильный код? Почему указатель "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() );

Ответы [ 2 ]

64 голосов
/ 18 ноября 2010

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

____________________   full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
     ^^^^^          ^
       |            |
     birth       funeral
45 голосов
/ 18 ноября 2010

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

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

РЕДАКТИРОВАТЬ 2:

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

...