BOOST_FOREACH循环中的变量集在外循环中是无效的,为什么?

时间:2010-11-26 07:57:33

标签: c++ boost

BOOST_FOREACH使作为GroupMember类成员的weak_ptr无效,请帮助我理解原因。

以下代码解释了错误:

class GroupMember
{
  bool logInState;
  boost::weak_ptr<CUser> wpUser;
};

GroupMember::iterator it;

BOOST_FOREACH(EachLevel aLevel, levels)
{
  if(aLevel.exist(spUser))
  {
    it = aLevel.getIteratorToGroupMember( spUser );
    //iterator (it) is valid as well as the group member's attributes (and weak_ptr)
  }
}

//Iterator (it) seems to be valid but the weak_ptr is invalid. 
//The counter to the object is more than 10 so the weak ptr is not expired.

以下代码完美无缺:

GroupMember::iterator it;
std::vector<EachLevel>::iterator itLevel;
for(itLevel = levels.begin(); itLevel != levels.end(); ++itLevel)
{
  if(itLevel->exist(spUser))
      it = itLevel->getIteratorToGroupMember( spUser );
}

//Here is iterator (it) valid (including the weak_ptr)

我看不出差异,可以吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

EachLevel aLevel创建一个本地对象aLevel,其范围仅在BOOST_FOREACH范围内。如果你从这个对象中取iterator,它将在循环外无效。您可以通过声明EachLevel& aLevel将其更改为引用,这样就不会创建任何副本,并且您的迭代器仍然有效。在第二种情况下,您直接访问对象而不创建任何副本,因此它可以工作。

答案 1 :(得分:3)

您认为BOOST_FOREACH的实现方式与您的第二个代码段相同,这是一个错误的假设。

其次,在你的BOOST_FOREACH中,你按值迭代。请参考:

BOOST_FOREACH(EachLevel& aLevel, levels) 

看看它是否有效。