2013-07-03 56 views
0
int* test_prt(const vector<int>* array, const int index) 
{ 
    return array+index; 
} 

爲什麼第一個參數不能是const?在這種情況下,「const」意味着什麼不能被修改?const vector <T> *哪部分是const?

+1

您確定要傳遞'的std :: VECTOR'作爲指針? –

+1

不會編譯:'array + index'與'array'的類型相同,不能轉換爲返回類型'int *'。 – aschepler

回答

2

const放在類型名稱後面很常見,因爲它啓用了「const to the left rule」。

這是一樣的,你寫的東西:

int* test_prt(vector<int> const* array, const int index) 
{ 
    return array+index; 
} 

這裏,左側的項目是載體,所以這是一個指向常向量。

如果你不使用這個約定,唯一的特例是當const完全在左邊(const的左邊沒有什麼東西),這意味着它適用於右邊的東西const

+0

經驗法則是const,它適用於左邊的東西。如果它左邊沒有任何東西,它就適用於最左邊的東西。 – Yakk

+0

所以在這種情況下,指針指向的內容不能修改,但指針本身可以移動? – nzomkxia

+0

@nzomkxia,是的,雖然它不是,但我建議使它成爲'const'。 – chris

0

我也會刪除前面的整數「const」。 因爲它是按值傳遞的阿根廷,

int* test_prt(vector<int> const* array, int index) 
{ 
    return array+index; 
} 
1

array + index不修改任何arrayindex,它只是計算兩個操作數的總和,而不會影響原有的,所以代碼工作作爲它應該。這裏的const表示矢量和index不能以任何方式改變。例如,如果我試圖改變array小號的元素之一,我得到一個錯誤:

array[0] = 5; // error! assignment of read-only value 

這同樣適用於index。順便說一句,我認爲你的函數簽名應該已被寫入:

int* test_prt(const vector<int>& array, const int index) 
{ 
    return &array[index]; 
    // or &array.at(index) which performs bounds checking 
} 

也就是說,我們把向量作爲參考,並使用其內部緩衝區的從第一個元素偏移指出。採取引用是非常重要的,因爲它避免了副本,並且返回指向本地副本的指針將是未定義行爲。你的原始代碼只有在array是一個實際的向量數組時纔會起作用!

而僅僅是明確的,這裏是你如何調用該函數:

std::vector<int> v = {1, 2, 3, 4, 5}; 

std::cout << test_ptr(v, 1); // prints the address of the 2nd element 
相關問題