sve*_*aro 8 c++ standards g++ visual-c++
我最近碰到了一个奇怪的问题,我在迭代多重集时得到了一个const_iterator而不是预期iterator的.事实证明这对于MSVC来说不是问题,但g ++给了我一个错误:
错误:从'const boost :: shared_ptr'类型的表达式初始化'myPtr&'类型的引用无效
相关代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
相当多的研究表明这是一个很多先前讨论的问题.我找到了这些相关的部分:
我对这个问题的背景知识和掌握是有限的,因此我想知道标准是否不能很好地定义这种行为,在这种情况下,g ++和MSVC可以根据自己的喜好实现行为,或者g ++或MSVC是否偏离了明确的标准.
提前致谢.
Ter*_*fey 16
set和multiset的迭代器从标准的iterator/const迭代器对变为const迭代器.这种更改的原因是它们是有序容器,更改迭代器内部的元素实际上可以使此排序约束无效.
您正在测试的GCC版本已经进行了此更改,您正在使用的VC版本没有.VC10(和VC9 SP1,我相信)总是从集合和多集合中返回const_iterators.
C++ 1x最新草案的23.2.4/6(目前为n3000.pdf)说
对于值类型与键类型相同的关联容器,iterator和const_iterator都是常量迭代器.
std :: set和std :: multi_set是关联容器,其值类型与键类型相同.
| 归档时间: |
|
| 查看次数: |
1470 次 |
| 最近记录: |