gpt4 book ai didi

c++ - BOOST_FOREACH 在使用 "break"时进入无限循环?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:08 25 4
gpt4 key购买 nike

下面的代码段在BOOST_FOREACH 语句,我不明白为什么。尽我所能从Boost文档中可以看出,使用“break”应该没问题在 BOOST_FOREACH 循环中。知道这里可能出了什么问题吗?

std::vector<std::wstring> sectors = getSectors();
if (!_sectorCodes.empty()) { // _sectorCodes is a std::set<std::wstring>.
bool ok = false; // did we find the sector code we wanted?
BOOST_FOREACH(Symbol sector, sectors) {
if (_sectorCodes.find(sector) != _sectorCodes.end()) {
ok = true;
break;
}
}
if (!ok) return NULL;
}

如果我用 for 循环替换 BOOST_FOREACH 循环(使用迭代器从 sectors.begin()sectors.end()),然后就可以正常工作了(没有无限循环)。

版本和附加信息:

  • boost :1.40.0
  • 海湾合作委员会:4.1.2
  • 架构:x86_64
  • 我只有在发布版本时才会出现这种行为;如果我进行调试构建,那么它会按预期工作。
  • 在 visual studio 下编译时,它按预期工作——即没有无限循环。

在回答 mkb 的问题时,这是我运行 gcc -E 时得到的结果:

if (!_sectorCodes.empty()) {
bool ok = false;
if (boost::foreach_detail_::auto_any_t _foreach_col148 = boost::foreach_detail_::contain( (sectors) , (true ? 0 : boost::foreach_detail_::or_( boost::foreach_detail_::and_( boost::foreach_detail_::not_(boost::foreach_detail_::is_array_(sectors)) , (true ? 0 : boost::foreach_detail_::is_rvalue_( (true ? boost::foreach_detail_::make_probe(sectors) : (sectors)), 0))) , boost::foreach_detail_::and_( boost::foreach_detail_::not_(boost_foreach_is_noncopyable( boost::foreach_detail_::to_ptr(sectors) , boost_foreach_argument_dependent_lookup_hack_value)) , boost_foreach_is_lightweight_proxy( boost::foreach_detail_::to_ptr(sectors) , boost_foreach_argument_dependent_lookup_hack_value)))))) {} else if (boost::foreach_detail_::auto_any_t _foreach_cur148 = boost::foreach_detail_::begin( _foreach_col148 , (true ? 0 : boost::foreach_detail_::encode_type(sectors, boost::foreach_detail_::is_const_(sectors))) , (true ? 0 : boost::foreach_detail_::or_( boost::foreach_detail_::and_( boost::foreach_detail_::not_(boost::foreach_detail_::is_array_(sectors)) , (true ? 0 : boost::foreach_detail_::is_rvalue_( (true ? boost::foreach_detail_::make_probe(sectors) : (sectors)), 0))) , boost::foreach_detail_::and_( boost::foreach_detail_::not_(boost_foreach_is_noncopyable( boost::foreach_detail_::to_ptr(sectors) , boost_foreach_argument_dependent_lookup_hack_value)) , boost_foreach_is_lightweight_proxy( boost::foreach_detail_::to_ptr(sectors) , boost_foreach_argument_dependent_lookup_hack_value)))))) {} else if (boost::foreach_detail_::auto_any_t _foreach_end148 = boost::foreach_detail_::end( _foreach_col148 , (true ? 0 : boost::foreach_detail_::encode_type(sectors, boost::foreach_detail_::is_const_(sectors))) , (true ? 0 : boost::foreach_detail_::or_( boost::foreach_detail_::and_( boost::foreach_detail_::not_(boost::foreach_detail_::is_array_(sectors)) , (true ? 0 : boost::foreach_detail_::is_rvalue_( (true ? boost::foreach_detail_::make_probe(sectors) : (sectors)), 0))) , boost::foreach_detail_::and_( boost::foreach_detail_::not_(boost_foreach_is_noncopyable( boost::foreach_detail_::to_ptr(sectors) , boost_foreach_argument_dependent_lookup_hack_value)) , boost_foreach_is_lightweight_proxy( boost::foreach_detail_::to_ptr(sectors) , boost_foreach_argument_dependent_lookup_hack_value)))))) {} else for (bool _foreach_continue148 = true; _foreach_continue148 && !boost::foreach_detail_::done( _foreach_cur148 , _foreach_end148 , (true ? 0 : boost::foreach_detail_::encode_type(sectors, boost::foreach_detail_::is_const_(sectors)))); _foreach_continue148 ? boost::foreach_detail_::next( _foreach_cur148 , (true ? 0 : boost::foreach_detail_::encode_type(sectors, boost::foreach_detail_::is_const_(sectors)))) : (void)0) if (boost::foreach_detail_::set_false(_foreach_continue148)) {} else for (Symbol sector = boost::foreach_detail_::deref( _foreach_cur148 , (true ? 0 : boost::foreach_detail_::encode_type(sectors, boost::foreach_detail_::is_const_(sectors)))); !_foreach_continue148; _foreach_continue148 = true) {
if (_sectorCodes.find(sector) != _sectorCodes.end()) {
ok = true;
break;
}
}
if (!ok) return PatternFeatureSet_ptr();
}

这个扩展的一个显着特点是有两个嵌套的 for 循环。我无法弄清楚内部循环和外部循环中发生了什么,但是否有可能(正如大卫所建议的那样)我正在打破内部循环,而 BOOST_FOREACH 并没有完全正确地处理某些问题原因?

最佳答案

我打赌简化函数:

std::wstring const* find(std::vector<Symbol> const& sectors) {
if (!_sectorCodes.empty()) {
BOOST_FOREACH(Symbol sector, sectors) {
std::set<Symbol>::const_iterator it = _sectorCodes.find(sector);
if (it != _sectorCodes.end()) { return &*it; }
}
}
return NULL;
} // find

解决问题。

虽然通过优化,很难知道......但至少你的代码将更具可读性。我没有你的 gcc 版本可以测试,而且我的(或 clang)从来没有遇到过任何问题,所以我只能建议 :x

关于c++ - BOOST_FOREACH 在使用 "break"时进入无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10603874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com