neu*_*rte 5 c++ pointers pass-by-reference undefined-behavior const-iterator
这段代码是我试图在其他地方做的事情的简化测试.我有一个函数,它接受一个"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;
}
Run Code Online (Sandbox Code Playgroud)
它ip = 3
按预期工作和打印,只是我担心它可能导致未定义的行为或以其他方式导致麻烦,因为我通过分配它的取消引用参数的结果来剥离迭代器的常量.我尝试添加const
(1)和(2),但它没有构建.
我有权担心吗?如果是这样,为什么我没有收到g ++(4.9.2)的警告?
代码非常好.你没有剥离任何常量(在C++中没有办法隐含地这样做).*it
给你一个const intp &
.您正在将该引用引用的指针复制到arg
.从某些东西复制不会剥夺常数.在您的情况下arg
分配的赋值ip
,它不会直接绑定到intp
容器内的对象.
归档时间: |
|
查看次数: |
667 次 |
最近记录: |