簡體   English   中英

為什么C ++不允許用戶定義的運算符?

[英]Why does C++ not allow user-defined operators?

我一直想知道這件事已經有一段時間了。 已經有很多它們可以超載,那么為什么不到最后並允許自定義運營商呢? 我認為這可能是一個很好的補充。

我被告知這會使語言難以編譯。 這讓我想知道,C ++無論如何都不能真正設計用於簡單的編譯,所以它真的可以撤銷嗎? 當然,如果你使用帶有靜態表和語法的LR解析器,例如

E → T + E | T
T → F * T | F
F → id | '(' E ')'

它不會起作用。 在Prolog中,通常使用運算符優先級解析器AFAIK進行解析,可以輕松定義新的運算符,但語言更簡單。 現在,顯然可以重寫語法,以便在操作符被硬編碼到語法中的每個地方接受identifiers

還有哪些其他解決方案和解析器方案以及其他哪些因素影響了設計決策?

http://www2.research.att.com/~bs/bs_faq2.html#overload-operator

這種可能性已被多次考慮過,但每次我/我們都認為可能出現的問題超過了可能帶來的好處。

這不是語言技術問題。 即使我在1983年首次考慮它,我也知道它是如何實現的。 然而,我的經驗是,當我們超越最微不足道的例子時,人們似乎對運營商使用的“明顯”含義有着微妙的不同看法。 一個經典的例子是a**b**c 假設**已經被認為是指取冪。 現在應該a**b**c是指(a**b)**c還是a**(b**c) 我認為答案很明顯,我的朋友們同意了 - 然后我們發現我們不同意哪個決議是明顯的。 我的猜想是,這些問題會導致細微的錯誤。

編譯比現有編譯更難。 此外,運營商的優先權會出現問題:您如何定義它? 您需要一種方法來告訴編譯器用戶定義的運算符優先於另一個運算符。

幾乎可以肯定它是可行的,但我認為C ++不需要其他方法來拍攝自己:-)

這會使語言變得更加復雜。 這顯然不可取。

不過,請查看Boost Spirit 使用大量的模板元編程技巧可以使你提到的東西成為可能。

實際上它的設計非常容易解析和編譯。 C有32個定義的關鍵字,所有其他標記都是函數和變量。

C ++只有一些。 人們可以很容易地識別哪個令牌是哪個,因此知道當使用+令牌或其他什么時要查找什么。

允許自定義運算符的問題是您還必須允許程序員指定運算符應該如何使用的語法。 我想C ++類型系統可以幫助一點,但它有助於解決關聯性等問題。

它會使已經很復雜的語言變得復雜得多......

這通常是避免的,因為大多數代碼都是由一個人編寫的,因此代碼應該是“可審閱的”,並且它幾乎不是語言的“期望”特征。

Joel Spolsky有一篇關於此的好文章

我剛剛發現它實際上可以實現與重載運算符非常相似的東西。 考慮

Vector v, a, b; v = a /vectorProduct/ b;

事實證明,您可以通過使用現有運算符分隔的虛擬類來實現自定義運算符的行為。 =)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM