Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于范围的for循环的对象生存期问题_C++_C++11_For Loop_Auto_Object Lifetime - Fatal编程技术网

C++ 基于范围的for循环的对象生存期问题

C++ 基于范围的for循环的对象生存期问题,c++,c++11,for-loop,auto,object-lifetime,C++,C++11,For Loop,Auto,Object Lifetime,我目前正在将代码转换为C++11,并且在以下基于范围的for循环中遇到了问题(FWIW,相同的代码在使用BOOST for_之前运行得很好) mLibraryFiles成员(STL向量)是单例实例的一部分,保证在方法返回后存在,但是当调用方检查返回的对象时,它只包含垃圾 通过它进行调试似乎在从方法返回后从预期内容变成垃圾,所以我想我一定是在C++11基于范围的循环实际工作方式方面出错了: Entry* FindEntry(string inName) { Entry *rs = NULL;

我目前正在将代码转换为C++11,并且在以下基于范围的for循环中遇到了问题(FWIW,相同的代码在使用BOOST for_之前运行得很好)

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&
否则它是一个临时副本,其生存期绑定到for循环。这就是为什么我更喜欢将对象的实际类型写入,而不是将
auto

声明
libraryEntry
auto&
,否则它是一个临时副本,其生存期绑定到for循环。这就是为什么我更喜欢编写对象的实际类型,而不是
auto

将向量中的值复制到循环中的libraryEntry,因此您有一个指向复制值的指针,该值在循环后不再存在。使用
auto&libraryEntry

将向量中的值复制到循环中的libraryEntry,因此您有一个指向复制值的指针,该值在循环后不再存在。使用
auto&libraryEntry

libraryEntry
mLibraryFiles
元素的副本。请改用
for(auto&libraryEntry:mLibraryFiles)
。llvm当前不是3.4版。你可能是说clang?@Nil Apple对其LLVM版本使用单独的版本编号方案。(是的,)苹果的版本不一定与上游LLVM版本一致,所以他们使用不同的编号方案来“避免混淆”。啊!很高兴知道,谢谢。@Nil是的,对于Xcode 5中显示的混淆版本表示抱歉,该版本声明Apple LLVM 5.0
libraryEntry
mLibraryFiles
元素的副本。请改用
for(auto&libraryEntry:mLibraryFiles)
。llvm当前不是3.4版。你可能是说clang?@Nil Apple对其LLVM版本使用单独的版本编号方案。(是的,)苹果的版本不一定与上游LLVM版本一致,所以他们使用不同的编号方案来“避免混淆”。啊!很高兴知道,谢谢。@Nil是的,对于Xcode 5中显示的混淆版本表示抱歉,该版本声明Apple LLVM 5.0herb sutter说,尽可能使用auto并避免使用实际类型。它免费为您提供了typedef的灵活性。编写实际类型(也没有
&
)也同样糟糕。herb sutter说,尽可能使用auto并避免使用实际类型。它免费为您提供了typedef的灵活性。如果没有
&
,那么编写实际的类型也同样糟糕。