【发布时间】:2015-09-09 08:05:35
【问题描述】:
此代码是对我在其他地方真正尝试做的事情的简化测试。我有一个函数,它接受一个“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) 的警告?
【问题讨论】:
-
“我尝试在 (1) 和 (2) 处添加 const,但没有构建。”:您是否也将
const添加到intptypedef? -
不...我将 typedef 视为愚蠢的字符串替换宏,只是将 const 放在
func声明中:void func(const intp &arg)。你的方式,它可以构建和工作,但我不明白有什么区别。 -
intp是一个指针。const intp是常量指针,它没有说明它指向的值的常量性。当你说typedef const int* intp时,你说它将指向一个 const 整数。 -
@neuviemeporte typedef 不是文本替换,它是类型的语义名称。
const intp &是对常量intp的引用 - 它是int * const &。 -
@neuviemeporte 做什么? “注入”
const到value_type如果它是一个指针?为此,您可以尝试std::add_pointer_t<std::add_const_t<std::remove_pointer_t<typename T::value_type>>>
标签: c++ pointers pass-by-reference undefined-behavior const-iterator