В настоящее время я конвертирую свой код в C ++ 11 и у меня возникают проблемы со следующим циклом for, основанным на диапазонах (FWIW, тот же самый код прекрасно работал раньше с BOOST for_each).
mLibraryFiles
член (вектор STL) является частью одиночного экземпляра и гарантированный существовать после возврата метода, однако, когда вызывающая сторона проверяет возвращаемый объект, он содержит только мусор.
Отладка через него, по-видимому, превращается из ожидаемого содержимого в мусор сразу после возвращения из метода, поэтому я полагаю, что у меня что-то не так в том, как на самом деле работает цикл на основе диапазона в C ++ 11:
Entry* FindEntry(string inName)
{ Entry *rs = NULL;
for (auto libraryEntry : mLibraryFiles)
{
if (libraryEntry.filename.compare(inName) == 0)
{
rs = &libraryEntry;
break;
}
}
return rs;
}
Я бы ожидал, что libraryEntry
Переменная представляет фактические объекты в mLibraryFiles
вектор?
Любое понимание высоко ценится!
(компилятор LLVM 5.0, хотя я сомневаюсь, что это важно ..)
Значения из вашего вектора копируются в libraryEntry в цикле, поэтому у вас есть указатель на скопированное значение, которое больше не существует после цикла. использование auto& libraryEntry
,
декларировать libraryEntry
как auto&
в противном случае это временная копия, время жизни которой связано с циклом for. Вот почему я предпочитаю писать фактический тип объекта вместо auto