5

这段代码是对我在其他地方尝试做的事情的简化测试。我有一个函数,它接受一个“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,只是我担心它可能会导致未定义的行为或导致麻烦,因为我通过将其取消引用的结果分配给参数来剥离迭代器的常量。我试图const在 (1) 和 (2) 处添加,但它没有构建。

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

4

2 回答 2

5

代码非常好。你没有剥离任何常量(在 C++ 中没有办法隐式地做到这一点)。*it给你一个const intp &。您正在将该引用引用的指针复制arg到. 从某些东西复制并不会剥夺 constness。在您的情况下,分配到的arg分配ip不会直接将任何内容绑定intp到容器内的对象。

于 2015-06-23T13:41:54.903 回答
2

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

于 2015-06-23T13:42:18.977 回答