簡體   English   中英

C ++標准:多集中的意外的const_iterator

[英]C++ Standard: Unexpected const_iterator in multiset

我最近碰到了一個奇怪的問題,我在迭代一個multiset時會得到一個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);
    }
}

相當多的研究表明這是一個很多先前討論的問題。 我找到了這些相關的部分:

我對這個問題的背景知識和掌握是有限的,因此我想知道標准是否不能很好地定義這種行為,在這種情況下,g ++和MSVC可以根據自己的喜好實現行為,或者g ++或MSVC是否偏離了明確的標准。

提前致謝。

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是關聯容器,其值類型與鍵類型相同。

如何欺騙std :: set :: iterator的編譯器?

我有結構

struct _item {
  int a;
  int b;
  bool operator <(const _item& x) const {return a<x.a;}
};

我只想更改成員b(b與集合中的排序無關,只比較成員a)。

std::set<_item> data;
std::set<_item>::iterator iter=data.begin();
iter->b=0;  // error !!!

Avada Kedavra!

struct _item {
  int a;
  int b;
  _item* self;
  _item() {self=this;} 
  bool operator <(const _item& x) const {return a<x.a;}
};
iter->self->b=0; // Success !! Tested on VC10

當然更多的C ++正確

struct _item {
  int a;
  int b;
 private:
  _item* self;
 public:
  _item() {self=this;} 
  bool operator <(const _item& x) const {return a<x.a;}
  int& bReference() const {return self->b;}
};
std::set<_item> items;
std::set<_item>::iterator iter=items.begin();
iter->bReference()=0; // Success !! Tested on VC1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM