我最近遇到了一个奇怪的问题,我会得到一个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(使用前将#替换为@)