これはおそらく一般的な答えではないでしょうが、C++ を際立たせているのは、テンプレートや #define などのコンパイル時の機能だと思います。これらの機能を使用して、プログラム上であらゆる種類のテキスト操作を行うことができます。これらの機能の多くは、後の言語では単純化のために放棄されています。私にとって、これは、C++ で簡単または高速であると思われる低レベルのビット操作よりもはるかに重要です。
たとえば、C# には実際のマクロ機能がありません。別のファイルをソースに直接 #include したり、 #define を使用してプログラムをテキストとして操作したりすることはできません。反復コードを機械的に入力する必要があり、より良い方法があることを知っていたときのことを考えてみてください。コードを生成するプログラムを書いたことがあるかもしれません。C++ プリプロセッサは、これらすべてを自動化します。
C# の「ジェネリック」機能は、C++ テンプレートと比較して同様に制限されています。C++ では、ドット演算子をテンプレート型 T にやみくもに適用し、(たとえば) 存在しない可能性のあるメソッドを呼び出すことができます。正確性のチェックは、テンプレートが実際に特定のクラスに適用された後にのみ適用されます。その場合、T について行ったすべての仮定が実際に成り立つ場合、コードはコンパイルされます。C# はこれを許可しません... 型 "T" は基本的にオブジェクトとして処理する必要があります。つまり、すべてに使用できる操作の最小公分母のみを使用します (代入、GetHashCode()、Equals())。
C# は、簡素化の名の下に、プリプロセッサと実際のジェネリックを廃止しました。残念なことに、私が C# を使用すると、必然的に C++ のアプローチよりも肥大化し階層化されたこれらの C++ 構造の代替物にたどり着くことになります。たとえば、プログラマーが #include の不在をいくつかの肥大化した方法で回避しているのを見てきました: 外部アセンブリに動的にリンクする、複数の場所で定数を再定義する (プロジェクトごとに 1 つのファイル)、データベースから定数を選択するなど。
シンプソンズのクラブアップルさんがかつて言ったように、これは「かなり不自由です、ミルハウス」。
コンピューター サイエンスの観点から言えば、C++ のこれらのコンパイル時機能により、値による呼び出しや参照による呼び出しよりも強力であることが知られている、名前による呼び出しパラメーターの受け渡しなどが可能になります。
繰り返しますが、これはおそらく一般的な答えではありません。たとえば、C++ の入門テキストでは、#define を使用しないように警告されます。しかし、長年さまざまな言語を扱ってきて、その背後にある理論を考慮した結果、多くの人が悪いアドバイスをしていると思います。これは、「IT」として知られる希薄化したサブフィールドで特に当てはまるようです。