如题
之前发出过提问
https://ask.csdn.net/questions/8042482?spm=1001.2014.3001.5505
写代码过程中遇到迭代器解引用赋值给常引用,发现常引用和迭代器解引用后指向的地址不一致。
常引用item的地址和*citer的地址不一样,不符合逻辑。
在这里插入代码片
void TestFunc2(const std::pair<int, QString>& item1)
{
}
std::map<int, QString> mymap{ {1,QString("a")} ,{2,QString("b")} ,{3,QString("c")} ,{4,QString("d")} };
std::map<int, QString>::const_iterator citer= mymap.cbegin();
const std::pair<int, QString>& item = *citer;
TestFunc2(item);
后续调试突然反应过来,是常引用item的类型有问题,在std::map<int, QString>这种情况下,迭代器解引用会指向他对应的值,值类型为value_type,此处value_type的类型为const std::pair<const int, QString>& ;而不是const std::pair<int, QString>& ;因为定义与之不对应,所以解引用赋值发生了重载,导致常引用的地址与迭代器解引用指向的地址不一致;
其次另外衍生出的问题:
在这里插入代码片
std::map<int, QString> mymap1{ {1,QString("a")} ,{2,QString("b")} ,{3,QString("c")} ,{4,QString("d")} };
std::map<int, QString> mymap2{ {1,QString("a")} ,{2,QString("b")} ,{3,QString("c")} ,{4,QString("d")} };
mymap1与mymap2虽然数据一致,但是迭代器不能混用,mymap1的迭代器不能与mymap2的作比较或者赋值等操作
迭代器的使用需要与对象对应!!!