星期四, 2月 21, 2008

解釋

昨天在逛學弟blog寫筆記時,一方面還蠻高興的,有認真看書,但是一方面也看到讓人覺得奇怪的錯誤XD
vector<int>::iterator mid = (ivec.begin()+ ivec.size())/ 2 ; // error!

簡單一點來說,學弟並不是很了解指標運算是什麼XD,算了。先來說明正式一點的原因,第一個最重要的原因就是,iterator並不支援operator overloading "/",在此算式中,由於使用了(),使得優先權較高先執行,operator+沒有問題,但是operator/ 就會變成undefined。

iterator支援operator+ 嗎? iterator共有5種concepts,分別是input iterator, output iterator, forward iterator, bidirectional iterator, random access iterator。應該要花時間把這幾種了解,而利用type traits實作advanced,是一個值得探討的問題。

就算回到C語言的指標運算,上述的算式也不是對的XD,我們稍微轉化一下成一般的狀況(使用陣列)。


const int N=10;
int u[N];
int* mid = (u+N)/2;

上述的程式碼編譯是一定會過的一定不會過的,但是通常得到的不是你想要的答案,想想為什麼呢?

為什麼不會過,看一下compiler給的message
invalid operands of types `int*' and `int' to binary `operator/'

指標運算支援前進或後退,但是不支援其他運算,顯然現在的type checking遠比以前好多了,我寫這類東西時,還是多多思考比較好。

---
寫解答的人一定很偉大...Orz

張貼留言