Ваша локальная версия может «работать», но она также страдает тем же, что и глобальная версия, что является неопределенным поведением.Во всех случаях, когда вы вызываете parseDateTimeWithFormat
, вы даете строковый литерал.Так как это не std::string
, временный создан для вас.Эта строка - то, что вы захватываете в
return [&formatStr](const std::string& dateTimeStr) {
std::cout << formatStr << std::endl;
tm t = {};
std::istringstream ss(dateTimeStr);
ss >> std::get_time(&t, formatStr.c_str());
const int timestamp = (int)mktime(&t);
return timestamp;
};
и возвращаете из лямбды.Unfornetly, как только закончится выражение, где вы назвали parseDateTimeWithFormat
, этот временный объект уничтожен, и у вас останется свисающая ссылка на formatStr
.Как вы обнаружили, исправление заключается в захвате по значению, чтобы у лямбды была собственная копия, и вы не пытались ссылаться на то, что больше не существует.