来自 const_iterator 取消引用的赋值会导致未定义的行为吗?
Can assignment from a const_iterator dereference cause undefined behaviour?
此代码是对我在其他地方真正尝试做的事情的简化测试。我有一个函数,它接受一个 "ref-to-ptr" 参数并将其修改为 return 指针列表中的一个指针。
#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 只是意味着你不能分配给那个迭代器 and/or 只能在它指向的对象上调用 const 函数。复制 value
没有问题 - 在本例中是一个指针。你没有存储 const 指针,如果你是,那么你将不得不分配给一个 const 指针
此代码是对我在其他地方真正尝试做的事情的简化测试。我有一个函数,它接受一个 "ref-to-ptr" 参数并将其修改为 return 指针列表中的一个指针。
#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 只是意味着你不能分配给那个迭代器 and/or 只能在它指向的对象上调用 const 函数。复制 value
没有问题 - 在本例中是一个指针。你没有存储 const 指针,如果你是,那么你将不得不分配给一个 const 指针