逛水木社區C++版塊,看到了一篇頗有意思的帖子--《C++20會變得陌生》。樓主貼出了分別用C++11 和 C++20編寫的代碼,以下:shell
void cpp_11() { std::vector<int> v{1, 2, 3, 4, 5}; std::vector<int> even; std::copy_if(v.begin(), v.end(), std::back_inserter(even), [](int i) { return i % 2 == 0; }); std::vector<int> results; std::transform(even.begin(), even.end(), std::back_inserter(even), [](int i) { return i * 2; }); for (int n : results) std::cout << n << ' '; } void cpp_20() { std::vector<int> v{1, 2, 3, 4, 5}; v | ranges::view::filter([](int i) { return i % 2 == 0; }) | ranges::view::transform([](int i) { return i * 2; }) | ranges::view::foreach([](int i) { std::cout << i << ' '; }); }
以上代碼實現了數據操做:編程
v
裏篩選出偶數的元素C++11 經過使用algorithm
裏的幾個函數按步驟實現;而C++20 經過使用新的ranges
擴展實現了相同的效果,經過使用|
將數據鏈接了起來,相似於Unix shell的管道。編程語言
我猜做者的意思應該是想表達C++20變化大,會讓一些人感到陌生,但下面的評論就頗有意思了,大致有如下幾類:
1.「顏值派」:這語法可真醜
2.「保守派」:C++在函數式編程上路愈來愈做死
3.「逃離派」:建議使用Rust
或Go
替代愈來愈臃腫的C++
4.「現實派」:C++真是愈來愈複雜了,連語法都看不懂,哪一天會撐爆
5.「理性派」:C++的一些痛點必須解決,而目前看來也只能這樣解決ide
近幾年,C++的演進進入了快車道,以前C++98到C++11,歷時13年;如今C++十一、C++1四、C++1七、C++20,每3年一版,帶來了改進的同時,也引發了衆多的吐槽,好比上面的評論。如今是個人一些見解,爲了不發散,針對上面的代碼作討論。函數式編程
美醜永遠是相對的,得看你跟誰比。好比,若是簡潔是一種美,那跟純函數式語言Haskell比,確定要醜了,下面是Haskell等價的代碼,很明顯要簡潔的多。函數
[1,2,3,4,5] & filter even & map (*2) & mapM_ print
跟C語言比呢?若是抽象是一種美,我以爲C++要美觀的多,好比C中只能經過循環來實現遍歷,而現代C++中已經有了不少結構控制函數,好比foreach
、filter
等,這種函數望文生義,你很明白就能知道代碼在幹什麼,而循環語句則須要你進到循環內部才能明白在作什麼。我是從C轉向C++的,起初寫C++代碼的時候,根本就不用引用、namespace
這些東東,而是用指針和命名前綴代替,當時也以爲不美。長此以往發現,指針傳參的時候要判斷指針是否爲空,這樣的代碼真的很醜,那麼長的標識符也很醜,而引用和名字空間剛好解決了這些問題,反卻是以爲好看了。工具
C++20 跟 C++11比呢?C++ 20美,由於上文的代碼既簡潔,又清晰了表達了代碼意圖。學習
C++語法是有巨大的歷史包袱的,想進步很難,但C++在語法上面是在進步的,好比使用{}
統一初始化語句,雖然初看起來比較彆扭,但一旦統一了,代碼看起來是比較漂亮的。代碼一致性也是美的一種。spa
函數式編程已經成了編程語言的必備特性,不光C++引入了,其餘語言,好比Java等等都包含了某些函數式語言的特性。從某種程度上來講,函數式編程是趨勢。好比,匿名函數在某些狀況下是很方便的,避免每次都要去定義一些僅用一次的函數。設計
C++20可能要引入的concepts也來源於函數式編程語言,包括Rust的trait,都跟haskell的typeclass有關,一旦編譯器支持了,對模板編程絕對是一大利好。
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++的語言或庫的特性了,大部分都是老工具很好的替代。
請關注個人公衆號哦。