若干釣りタイトルですが,私が「Rust にはない C++ の良さ」を募ったところ,12 個ほどの優れている点が報告されたので,まとめてみます.
背景
私は 2018/10/08 開催予定の技術書典5で,『C++でできる!OS自作入門』と題して,Clang+LLD で C++ を使って OS 開発する際の注意点とか C++ の活用例を解説する同人誌を書こうと思っています. その下調べもかねて,このようなツイートをしました.
そうしたら知り合いからこんなリプが飛んできました.
一部の人に参考になるかもしれないのでまとめることにしました.ただしネタ多めです.
私の立場
私(@uchan_nos)の立場を表明しておくとこんな感じです.
- C++ が大好き.
- Rust は書いたことはないが,人から聞く限り良い言語だと思う.静的解析をガンガン使ってプログラムのミスを発見するのはコンパイラの目指すべき方向性だと思っており,ゆえに Rust の方向性は素晴らしい.
- C++ は Rust より優れていない点が多いように見える.が,そこがかわいいし,使いこなしている感があって好き.何とかして C++ が優れている点を発見したい.
反応まとめ
-
- 解説:C++ はいとも簡単にメモリの整合性を崩すことができる.ダングリングポインタの生成ならお任せあれ.Rust では,そのような危険な操作をするにはコードを unsafe で囲まなければならない.
-
- 解説:C++完全に理解した。
型のキャストが1発で出来る(・∀・)。Rust だと レガシーな API を呼ぶときなどに as を連ねることが割とある(・∀・)。
- 解説:C++ ではポインタの型のキャストは
static_cast<int>(1.2)
やreinterpret_cast<uint8_t*>(0x4000)
などと書くことが可能.
- 解説:C++ ではポインタの型のキャストは
-
- 解説:Rust コンパイラは安定板と nightly build 版があり,ベアメタルプログラミングで使いたくなる機能が,現状では nightly build 版にしかない.
Rustはスコープベースでのポインタの安全性に関しては極められているけれど、それ以外の状況ではスマートポインタに丸投げになってる。C++ではRustでスマートポインタに丸投げされてる部分に踏み込める。
- スマートポインタを使わないこともできるでしょ。個人的には一切使ってないし。Rust的のスコープベース管理に相当する部分では所有権に留意してればいいし、リストなんかにぶら下がってる自己deleteが前提なオブジェクトはリストにぶら下がってる事自体が存在証明なのでスマートポインタは不要。
-
- 解説:メモリ関連のエラーを起こさない自信がある部分のプログラミングには防御が少ない C++ で書いた方がイライラが少ないことがある.
-
- 解説:難しいものを使いこなす感が良い.
あとはグラフ構造を操作するときはRustよりC++の方が書きやすいと.Rustだと循環参照があるようなデータ構造を操作するのが非常に面倒だ,ということでした.
Rust だと面倒、というよりも Rust だと間違えない代わりに動かすまでに時間がかかって、C++ だと間違えて死ぬ、だと思います。
可能な限りすべてをコンパイル時に。可変長引数で美味しく行こう。overloadは基本的人権
- 解説:C++ は可能な限り実行時オーバーヘッドを無くすことを至上命題として設計されている節がある.オーバーロードはC++の強みというが、Rustでもそれっぽいことはできる。 という意見もあった.
追記
この記事の初版を書いた後に発見した反応たちをまとめます.まだこの記事に載ってない Rust に対する C++ の良さをご存知の方は,是非教えてください.追加します.
-
- 解説:非型テンプレートパラメタを使うと整数値などを受け取れる.
template <size_t N>
とか.
- 解説:非型テンプレートパラメタを使うと整数値などを受け取れる.
<cfenv>
相当の機能がRustになくて困る- 浮動小数点数の丸め方法が変更されない前提で作られてるらしく、軽く絶望した
https://twitter.com/range_v3/status/1033161245426253824
- 解説:LLVM は色々な言語のバックエンドとして使われている.が,LLVM はちょっと浮動小数点数のサポートが弱いとのこと.Rust は浮動小数点数使いの人には絶望する仕様らしい.
- 追加でリンクをいただいた. LLVM (thus, Rust) floating point support support is incomplete
というかC++のいいところのひとつにBoost入れていいんじゃなかろうか
- 解説:Boost はとても機能が豊富なライブラリ.モダンな C++ で書かれていて良さがある.
Rustではどうか分かりませんが、C++でできることは、ソースコード量の59億倍のコンパイルエラーメッセージを出力することです。WSL g++ 5.4.0だとコンパイルが終わりません。