这段代码是我试图在其他地方做的事情的简化测试。我有一个功能,需要一个" 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
,只是我担心它可能导致未定义的行为或导致麻烦,因为我通过分配它的结果来剥离迭代器的常量&#39 ; s取消引用参数。我尝试在(1)和(2)添加const
,但它没有构建。
我是否有权利担心?如果是这样,为什么我没有收到g ++(4.9.2)的警告?
答案 0 :(得分:5)
代码非常好。你并没有剥离任何常量(在C ++中没有办法隐含地这样做)。 *it
为您提供const intp &
。您将将该引用引用的指针 复制到arg
。从某些东西复制不会剥夺常数。 arg
的赋值在您的情况下分配到ip
,它不会绑定任何东西直接绑定到容器内的intp
对象。
答案 1 :(得分:2)
const_iterator只是意味着你不能分配给那个迭代器和/或只能在它指向的对象上调用const函数。复制value
没有问题 - 在这种情况下是一个指针。你不是存储const指针,如果你是,那么你必须分配一个const指针