本節書摘來自異步社群出版社《c++覆轍錄》一書中的第1章,第1.11節,作者: 【美】stephen c. dewhurst(史蒂芬 c. 杜赫斯特),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
c++語言和c語言看起來會吸引相當多的人去張揚個性(你有沒有聽說過一個叫“obfuscated eiffel”的比賽?)46。在這些軟體工程師的思維裡,兩點間的最短距離是普通歐氏空間之球面扭曲上的大圓。
試舉一例:在c++語言的圈子裡(且不論這個圈子是不是普通歐氏空間裡的),代碼的排版格式純粹是為了友善解讀代碼的人類的,而對于代碼47的意義,隻要語彙塊的次序還是按原先的次序的依次出現,就怎麼都無所謂。這最後一個附加條款殊為重要,比如,以下這兩行表示的是非常不同的意思48(但是請看常見錯誤87):
ptr->*m; // 沒問題
ptr-> *m; // 錯誤!⑤<code>`</code>
⑤譯者注:->*合起來才是一個運算符。
上面的例子容易讓大多數c++軟體工程師同意,隻要注意不去趟語彙塊劃分錯誤的渾水,代碼的排版格式就再次高枕無憂地和代碼的意義無關了。是以,把一個聲明變量的語句寫在一行裡還是分成兩行寫,結果别無二緻。(有一些軟體開發環境的調試器以及其他工具元件是依據代碼的行數,而不是其他更精确的定位邏輯來實作的。這樣的工具經常強迫軟體工程師去把本來可以寫在一行裡的代碼硬分成既不自然也不友善的數行來寫,以得到更精準的錯誤提示錯誤,或是設定更精準的斷點,等等。這不是c++語言的毛病,而是c++軟體開發環境作者的毛病。)
template
struct select {
typedef a result;
};
typedef b result;
};<code>`</code>
具現<code>select</code>模闆的過程是先在編譯期對一個條件評估求值,然後根據此表達式的布爾結果具現此模闆的兩個版本之一。這相當于一個編譯期的if語句說“如果條件為真,那麼内含的<code>result</code>的型别就是a,否則它的型别就是b。”
const char cm = char_max;
const select<_ line _<=cm,char,long>::result curline =_ _line ;<code>`</code>
上面這段代碼是管用的(且算它正确),但是這一行太長了,是以維護工程師便随後稍稍把它重新排了一下版: