我目前正在将我的代码转换为C ++ 11并且在以下基于范围的for循环中遇到问题(FWIW,相同的代码在使用BOOST for_each之前运行得很好)。
mLibraryFiles
成员(STL向量)是单例实例的一部分,保证在方法返回后存在,但是当调用者检查返回的对象时,它只包含垃圾。 / p>
通过它进行调试似乎在从方法返回之后从预期内容转为垃圾,所以我想我一定是对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虽然我怀疑这很重要..)
答案 0 :(得分:8)
向量中的值将被复制到循环中的libraryEntry,因此您有一个指向复制值的指针,该值在循环后不再存在。使用auto& libraryEntry
。
答案 1 :(得分:4)
将libraryEntry
声明为auto&
,否则为临时副本,其生命周期与for循环绑定。这就是为什么我更喜欢写对象的实际类型而不是auto