這段代碼是一個簡單的測試,我正在嘗試爲其他地方的真實事情做些什麼。我有一個函數,它採用「ref-to-ptr」參數並修改它以從指針列表返回指針。const_iterator的引用可以導致未定義的行爲嗎?
#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'添加到'intp' typedef? – Petr
不......我把typedef當成了一個愚蠢的字符串替換宏,只是把const放在'func'聲明中:'void func(const intp&arg)'。你的方式,它建立和運作,但我不明白有什麼區別。 – neuviemeporte
'intp'是一個指針。 'const intp'是常量指針,它沒有說明它指向的值的常量。當你說'typedef const int * intp'時,你說它會指向一個常量整數。 – Petr