这段代码是对我正在尝试在其他地方进行的某些事情的简化测试。我有一个函数,它使用“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,它不会将任何内容直接绑定(bind)到容器内的intp对象。

关于c++ - 可以从const_iterator取消引用中进行赋值导致未定义的行为吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31004221/

10-11 22:47
查看更多