stl_vector.h:43: error: passing ‘const vector<int, __default_alloc_template<false, 0> >’ as ‘this’ argument of ‘T* vector<T, Alloc>::begin() [with T = int, Alloc = __default_alloc_template<false, 0>]’ discards qualifiers
這個是我看了侯大師的STL源碼剖析後,自己模仿實現vector時出現的錯誤
相關的代碼
iterator begin(){return start;}
iterator end(){return finish;}
size_type size()const
{
return size_type(end() - begin());
}
產生discards qualifiers類錯誤可能原因如下
Usual Causes
1. A non-const member function is being invoked for a const object
2. A const object is being passed as a non-const parameter
3. A const member function calls a non-const member function
在這是我是用一個 const修飾的size調用了非const方法 begin() 和end() 雖然我在size()中並沒有修改什麼內容,但編譯是不通過的,從編譯的角度就杜絕你可能通過調用非const方法來間接 修改。
其實侯大師的書裏,爲了簡介把源碼去掉了很多內容 我就傻了吧唧的敲上去了。。。
去看了一下庫裏的
庫裏有相應的const版的begin 和end 供const方法調用的
(借用幾點別人的總結):
關於Const函數的幾點規則:
const對象只能訪問const成員函數,而非const對象可以訪問任意的成員函數,包括const成員函數.
const對象的成員是不可修改的,然而const對象通過指針維護的對象卻是可以修改的.
const成員函數不可以修改對象的數據,不管對象是否具有const性質.它在編譯時,以是否修改成員數據爲依據,進行檢查