const_iterator取消引用的赋值是否会导致未定义的行为
Can assignment from a const_iterator dereference cause undefined behaviour?
这段代码是一个简化的测试,我正试图在其他地方做一些真实的事情。我有一个函数,它接受一个"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
没有问题,在这种情况下是指针。您没有存储常量指针,如果是,则必须将分配给常量指针
相关文章:
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++ 通过自定义赋值运算符隐式转换函数参数
- boost::any 如何检查空值/未定义的值
- 在未初始化的变量上使用复合赋值运算符(+=, ..)不是C++中的UB?
- 在C++中,我可以在定义自己的复制构造函数后跳过定义赋值运算符吗?
- C++定义/赋值语法
- 如何使用数组 (C++) 读取具有未定义数量的值的 .txt 文件?
- 是否未定义将对函数范围变量的引用作为值返回
- 当在基类中定义枚举时,qml中的Q_ENUM未定义值
- C++:私有类指针成员返回未定义的值
- 类模板的用户定义赋值运算符时遇到问题
- 当我只想禁用自定义赋值运算符=()的签名时,它是否重要
- 初始化变量列表中的赋值顺序是否未定义
- 如果未定义赋值运算符,是否调用复制构造函数?
- 未定义的值,调试器,为什么
- 定义赋值运算符 = 只允许零 RHS,否则无法编译
- 如何习惯地为不可变类定义赋值操作符
- const_iterator取消引用的赋值是否会导致未定义的行为
- 定义赋值运算符和复制构造函数
- Vector具有未定义的值,即使这些值已被显式定义