它將使解析&編譯 語言更容易
我怎麼沒看到。爲什麼分析和編譯i <i> i
更容易,如果你需要需要來發布診斷,而不是解析它,如果你被允許做任何你該死的任務,請確保發出的代碼沒有副作用?
Java編譯器禁止無法訪問的代碼(與無效的代碼相反),這對程序員來說是一種混合的祝福,並且需要編譯器的額外工作,而不是C++編譯器實際需要做的事情(基本塊依賴性分析)。 C++應該禁止無法訪問的代碼?可能不會。儘管C++編譯器確實做了足夠的優化來識別無法訪問的基本塊,但在某些情況下,它們可能做得太多。如果foo
是一個錯誤的編譯時常量,if (foo) { ...}
應該是一個非法的不可達塊嗎?如果它不是一個編譯時常量,但是優化器已經計算出如何計算該值,如果它是合法的並且編譯器必須認識到它將它移除的原因是特定於實現的,以免給出錯誤?更特殊的情況。
沒有人真正有任何電流 程序,有沒有 副作用他們
載荷表達式。例如,如果NDEBUG
爲真,那麼assert
將擴展爲無效表達式,但不起作用。所以在編譯器中需要更多特殊情況來允許一些無用的表達式,但不允許使用其他表達式。 (a)編譯器最終會拋出諸如if (foo) assert(bar);
之類的警告,並且(b)這樣的代碼在發佈時是合法的,但在調試時不合法,只是令人困惑:
assert(foo) // oops, forgot the semi-colon
foo.bar();
之類的東西最讓人頭疼的解析
,這就是爲什麼它被稱爲 「令人煩惱」。這是一個向後兼容的問題。如果C++現在改變了那些煩人的分析的含義,現有代碼的含義就會改變。正如你指出的那樣,現有的代碼並不多,但C++委員會在向後兼容性方面採取了相當強硬的措施。如果您想要每五分鐘更改一次的語言,請使用Perl ;-)
無論如何,現在已經太晚了。即使我們對C++ 0x委員會錯過了一些很好的見解,爲什麼某些特性應該被刪除或者不兼容地改變,除非FCD明確錯誤,否則它們不會破壞FCD中的任何內容。
請注意,對於您的所有建議,任何編譯器都可能爲它們發出警告(實際上,我不明白您的問題與第二個示例有什麼關係,但對於無用的表達式和對函數體中令人厭煩的解析來說肯定是這樣) 。如果你是對的,沒有人故意這樣做,警告不會造成任何傷害。如果你錯誤地認爲沒有人這麼做,你所說的刪除它們的情況是不正確的。流行編譯器中的警告可能會爲刪除功能鋪平道路,特別是因爲標準主要由編譯器編寫者撰寫。事實上,我們並不總是得到這些事情的警告,這對我來說意味着它比你想象的還要多。
除了如果編譯器有兩種方法可以解析語句,但其中一種是非法的,那麼它知道它必須是另一種,這很簡單,而如果標準允許這兩種方式,那麼編譯器必須決定哪一個,哪一個簡單得多。那裏的可行性程序越不可靠,您需要決定哪些程序的邏輯就越少。 – Puppy 2010-11-10 12:43:10
雖然這並非總是如此,因爲編譯器需要檢測某些無效表達式並報告適當的錯誤消息。在任何情況下,如你所暗示的,它肯定不能認爲代碼是有效的。 – 2010-11-10 16:02:36
+1表示智能(和有效)參數。 :-) – 2011-01-04 22:09:43