5

這段代碼是一個簡單的測試,我正在嘗試爲其他地方的真實事情做些什麼。我有一個函數,它採用「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

「我試圖在(1)和(2)添加常量,但它沒有建立。」:你還有將'const'添加到'intp' typedef? – Petr

+0

不......我把typedef當成了一個愚蠢的字符串替換宏,只是把const放在'func'聲明中:'void func(const intp&arg)'。你的方式,它建立和運作,但我不明白有什麼區別。 – neuviemeporte

+0

'intp'是一個指針。 'const intp'是常量指針,它沒有說明它指向的值的常量。當你說'typedef const int * intp'時,你說它會指向一個常量整數。 – Petr

回答

5

代碼非常好。你並沒有去除任何常量(在C++中沒有辦法隱式地做到這一點)。 *it給你一個const intp &。你是複製該引用所指的指針arg。從東西複製不會剝離常量。 arg的賦值分配到ip在你的情況下,它不會綁定任何東西都直接指向容器內的intp對象。

+0

如果我正確讀取它,這意味着'* it'是「引用const int的指針」。我怎樣才能將它分配給'val',它是「對int指針的引用」(非const)? – neuviemeporte

+0

好的,我想我現在明白了 - 它是「指向int的const引用」,對吧?指針永遠不是const。 – neuviemeporte

+0

@neuviemeporte是的,它是「引用(常量(指向int的指針))」。在數學意義上使用括號。 – Angew

2

const_iterator只是意味着你不能指定該迭代器和/或只能調用它指向的對象的const函數。複製value沒有問題 - 在這種情況下是指針。你不存儲常量指針,如果你是,那麼你將不得不分配給一個常量指針

相關問題