背景
之前看到了一篇很有意思的帖子“C++20會變得陌生”。樓主貼出了分別用C++11 和 C++20編寫的代碼,如下:

以上代碼實現了數據操作:
● 從向量v里篩選出偶數的元素
● 將以上得到的每個元素分別乘以2
● 將以上得到的每個元素分別打印出來
C++11 通過使用algorithm里的幾個函數按步驟實現;而C++20 通過使用新的ranges擴展實現了相同的效果,通過使用|將數據連接了起來,類似於Unix shell的管道。
我猜作者的意思應該是想表達C++20變化大,會讓一些人感到陌生,但下面的評論就很有意思了,大體有以下幾類:
1.“顏值派”:這語法可真丑
2.“保守派”:C++在函數式編程上路越來越作死
3.“逃離派”:建議使用Rust或Go替代越來越臃腫的C++
4.“現實派”:C++真是越來越復雜了,連語法都看不懂,哪一天會撐爆
5.“理性派”:C++的一些痛點必須解決,而目前看來也只能這樣解決

幾點看法
近幾年,C++的演進進入了快車道,之前C++98到C++11,歷時13年;現在C++11、C++14、C++17、C++20,每3年一版,帶來了改進的同時,也引起了眾多的吐槽,比如上面的評論。
現在是我的一些看法,為了避免發散,針對上面的代碼做討論。
✿ 關於語法
美丑永遠是相對的,得看你跟誰比。比如,如果簡潔是一種美,那跟純函數式語言Haskell比,肯定要丑了,下面是Haskell等價的代碼,很明顯要簡潔的多。

跟C語言比呢?如果抽象是一種美,我覺得C++要美觀的多,比如C中只能通過循環來實現遍歷,而現代C++中已經有了很多結構控制函數,比如foreach、filter等,這種函數望文生義,你很明白就能知道代碼在干什么,而循環語句則需要你進到循環內部才能明白在做什么。
我是從C轉向C++的,起初寫C++代碼的時候,根本就不用引用、namespace這些東東,而是用指針和命名前綴代替,當時也覺得不美。
久而久之發現,指針傳參的時候要判斷指針是否為空,這樣的代碼真的很丑,那么長的標識符也很丑,而引用和名字空間恰好解決了這些問題,反倒是覺得好看了。
C++20 跟 C++11比呢?C++ 20美,因為上文的代碼既簡潔,又清晰了表達了代碼意圖。
C++語法是有巨大的歷史包袱的,想進步很難,但C++在語法上面是在進步的,比如使用{}統一初始化語句,雖然初看起來比較別扭,但一旦統一了,代碼看起來是比較漂亮的。代碼一致性也是美的一種。
✿ 關於函數式
函數式編程已經成了編程語言的必備特性,不光C++引入了,其他語言,比如Java等等都包含了某些函數式語言的特性。
從某種程度上來說,函數式編程是趨勢。比如,匿名函數在某些情況下是很方便的,避免每次都要去定義一些僅用一次的函數。
C++20可能要引入的concepts也來源於函數式編程語言,包括Rust的trait,都跟haskell的typeclass有關,一旦編譯器支持了,對模板編程絕對是一大利好。
C++既然是多泛型語言,再多支持一個函數式,也就不奇怪了。
✿ 關於C++的替代語言
這方面,Rust和Go的呼聲最高。
在我看來,C++不會被替代,但Rust是一種比C++更好的選擇,而Go可能是Java的替代。
簡要說下兩門語言的對比:Rust和Go的語言設計是兩個方向,前者從學術化出發,兼顧實用化,后者從實用化出發,慢慢引入其他高級特性。
1.從整體上看,Rust語言要完整,后期出現坑的可能性要小,Go通過簡單吸引了大量的開發者,在1.0版泛型都沒有,而且異常處理極其單薄。從語言一致性上看,Rust較好。
2.從語言效率看,Rust跟C++都沒有GC,速度相當;Go有Gc,速度是優於Java的,但離C++還有一段距離,而且這個距離很難再減了。
有一點要提,Go入門實在是太快了,稍微看一下語法,在ide里就可以寫代碼了;而Rust的所有權、borrow機制,尤其是生命期就攔住了不少人。
如果沒有特殊需求,優選新語言,因為新語言歷史包袱少,能剪掉很多學習成本。
✿ 關於C++的體量
這幾年,C++加快了演進速度,越來越多的特性加入到了語言當中,相對地,C++做減法的速度卻沒快起來。這導致了一種結果,就是C++語法膨脹的太快了。而且C++還要兼容C語言,最后語言規范刷刷的漲。
關於對策,語言的標准我們是沒有可操縱空間的,但我們可以選擇自己的“個人標准”。如,你是做應用開發的,用到底層特性的可能性不大,這個時候,你就完全可以不用原始指針、不用宏、僅使用{}初始化。。。這樣是完全可以的。

總結
現代C++是在進步的。后續文章開始寫一些現代C++的語言或庫的特性了,大部分都是老工具很好的替代。

最后,不管你是轉行也好,初學也罷,進階也可,如果你想學編程~
——【值得關注】我的 C/C++編程學習交流俱樂部!——
涉及:C語言、C++、windows編程、網絡編程、QT圖形界面開發、Linux編程、游戲編程、數據結構與算以及數據庫......