const_iterator取消引用的赋值是否会导致未定义的行为

Can assignment from a const_iterator dereference cause undefined behaviour?

本文关键字:未定义 赋值 iterator 取消 引用 const 是否      更新时间:2023-10-16

这段代码是一个简化的测试,我正试图在其他地方做一些真实的事情。我有一个函数,它接受一个"ref to ptr"参数,并将其修改为从指针列表中返回一个指针。

#include <iostream>
#include <list>
using namespace std;
typedef int* intp;
typedef std::list<intp> intplist;
intplist myList;
void func(intp &arg) // (1)
{
    intplist::const_iterator it = myList.begin();
    std::advance(it, 2);
    arg = *it;
}
int main()
{
    myList.push_back(new int(1));
    myList.push_back(new int(2));
    myList.push_back(new int(3));
    int* ip = NULL; // (2)
    func(ip);
    if (ip) cout << "ip = " << *ip << endl;
    else cout << "ip is null!" << endl;
    for (intplist::const_iterator it = myList.begin(); it != myList.end(); ++it) 
        delete *it;
    return 0;
}

它按预期工作并打印ip = 3,只是我担心它可能会导致未定义的行为或以其他方式导致麻烦,因为我通过将迭代器的解引用结果分配给参数来消除它的常量。我尝试在(1)和(2)中添加const,但没有构建。

我担心是对的吗?如果是,为什么我没有收到g++(4.9.2)的警告?

代码非常好。你并没有去除任何常量(在C++中没有办法隐式地做到这一点)。*it给你一个const intp &。您正在将引用引用的指针复制到arg中。抄袭并不能消除惊愕。对arg的分配分配到ip中。在您的情况下,它不会直接将任何东西绑定到容器内的intp对象。

const_iterator只是意味着你不能分配给迭代器和/或只能在它指向的对象上调用const函数。复制value没有问题,在这种情况下是指针。您没有存储常量指针,如果是,则必须将分配给常量指针