2013-01-04 30 views
13

我知道要問爲什麼?是這個網站的一個不好的問題,因爲我們不知道。但我的意思是它作爲一個口語替代問,有什麼可能的原因?爲什麼不是 - > []在C++中的運算符? (解引用數組指針的下標運算符)

我發現自己寫,自然,

foo->[i]; 

並且是驚訝地得知,它沒有工作。我的意思是寫:

(*foo)[i]; 

我相信大部分人認爲已經明白我的意思,但要清楚,我想

bar.subscript(i); 
foo->subscript(i); 

就類似於

bar.operator[](i); 
foo->operator[](i); 

但這似乎並非如此。爲什麼?我確定我必須以某種錯誤的方式看待事情,但我無法弄清楚什麼。我知道的理論很少,因此非常感謝一位非專業人士的解釋。

如果在我的類比中沒有明顯的錯誤,那麼語言的設計者可能會將操作員排除在外的原因是什麼?它含糊不清? (?如果是這樣,作爲出錯的什麼)


我想提出一些意見到編輯,按@克里斯的建議,因爲我還沒有明確的,因爲我本來應該:

OP提出操作符 - > [],這兩者的組合。
- chris
他在問爲什麼他想要的東西不存在,並不是爲什麼他要編寫的代碼不起作用。
- Matthew'Cogwheel'奧蘭多
+0

一個有趣的問題是「難以解析」。我不知道這個問題的答案。 – Yakk

+1

@Yakk,我懷疑最大的蒙克效應。我正要對此發表評論。 – chris

+2

因爲當時沒有人想到它,沒有人關心足夠的標準。這就是99%的「X似乎很好,爲什麼不C++」有問題的原因。對於這樣的問題尤其如此:告訴人們寫'(* x)。[i]'而不是'x - > [i]'更容易,而不是做所有改變標準文本的工作,測試它,確保沒有可怕的疏忽等等。 – GManNickG

回答

3

語言的設計者可能已經離開操作員出了什麼原因?

1:沒有人提出它。如果它沒有被提出,它就不會被用到語言中。

2:看起來不對。 operator->可能會返回一個指針,但使用它的語言是「引用此指針並訪問成員」。這就是->的語言。所以當有人看到->[]時,它看起來不正確。在其他情況下,->右邊的內容是某種形式的成員標識符。

3:因爲有更重要的事情要做,而不是像這樣改變一些小事。

+4

'foo - >(bar)= baz - > [snaf]' - oo,別忘了'foo - > ++'!哦,'foo - > [bar] - > [snaf] - > [meh] = 7' - 想想我們可以從中得到的語法! – Yakk

+0

啊,好的。不,我同意,也許這不是一個值得做的建議,更不是一個值得做的改變。我更多地問,因爲我認爲我的邏輯出了問題,而不僅僅是有人/主觀因素。謝謝。 –

+1

@Yakk - 啊,其實我發現你的例子揭示了一個很好的理由,爲什麼這個可能被省略了!我沒有意識到其他運營商的大量推出必須與我所說的一致。 –

4

的權利operator->必須是成員的名稱。一個明確的operatorXYZ算作我猜的成員的名字,所以foo-> operator []是允許的。但是,隨機令牌如[]不算作爲會員的名稱,因此foo - > [i]是不允許的。

+2

這就是爲什麼它會成爲'operator - > [](foo,i);'的等價物。 – chris

+0

如果這是答案,那麼我不太明白它,但... –

+1

@ acheong87,這個答案的基礎是' - >'和'[]'是兩個獨立的運算符。把它們合併成一個,就像你問的那樣,會使它工作正常。 – chris

1

我想,原因是在C++中,您將使用vector(或C++ 1中的array)而不是指針到C數組。在以C++爲中心的解決方案中,不需要這樣的操作員,因此它可能被認爲是編譯器的額外工作,同時幾乎沒有任何好處。

如果你需要一個二維數組,那麼foo[0][i]已經與C數組一起工作。

+0

咦?我可以在任何時候使用'operator []'指針或迭代器來看到這個操作符的用法,這在C++中似乎比在C中更可能(儘管整體上並不十分常見)。 – delnan