C++ 标准:多重集中出现意外的 const_iterator

2023-11-22

我最近遇到了一个奇怪的问题,我会得到一个const_iterator而不是预期的iterator当迭代多重集时。事实证明这对 MSVC 来说不是问题,但 g++ 给了我一个错误:

错误:无效的初始化 'myPtr&' 类型的引用来自 'const 类型的表达式 提升::shared_ptr'

相关代码:

typedef std::multiset<myPtr> myList;
myList _mystuff;
void tick(float dt)
{
    for (myList::iterator i = _mystuff.begin(); i != _mystuff.end(); ++i)
    {
        myPtr &mine = *i; // g++ problem here, not for MSVC
        // const myPtr &mine = *i; works fine for g++
        mine->tick(dt);
    }
}

相当多的研究表明,这是之前讨论过的一个问题。我找到了这些相关的内容:

  • http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14990
  • http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#322
  • http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103
  • http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-close.html#279
  • http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-close.html#528

我对这个问题的背景知识和掌握是有限的,因此我想知道该标准是否没有足够好地定义这种行为,在这种情况下,g ++和MSVC根据自己的喜好实现了该行为,或者g ++或MSVC是否偏离了明确的标准。

提前致谢。


set 和 multiset 的迭代器从标准迭代器/const 迭代器对更改为 const 迭代器。进行此更改的原因是它们是有序容器,并且更改迭代器内部的元素实际上会使此排序约束无效。

您正在测试的 GCC 版本已进行此更改,而您正在使用的 VC 版本则没有。 VC10(和 VC9 SP1,我相信)总是从集合和多重集合返回 const_iterators。

C++1x 最新草案(目前为 n3000.pdf)的 23.2.4/6 说

对于关联容器,其中 值类型与键相同 类型,iterator 和 const_iterator 是常量迭代器。

std::set 和 std::multi_set 是关联容器,其中值类型与键类型相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 标准:多重集中出现意外的 const_iterator 的相关文章

随机推荐