まず、「古いオブジェクトの破棄とそれに続く新しいオブジェクトのコピー構築」は例外安全ではないことに注意してください。
しかし、「新しいオブジェクトのコピー構築、その後の古いオブジェクトとのスワップ、それに続く古いオブジェクトの破棄」については、これが代入演算子を実装するためのスワップイディオムであり、正しく実行されれば例外セーフです。
場合によっては、カスタム代入演算子が swap イディオムよりも高速になることがあります。たとえば、POD 型の直接配列は、下位レベルの割り当てによる場合を除き、実際にはスワップできません。そのため、swap イディオムについては、配列サイズに比例するオーバーヘッドが予想されます。
ただし、歴史的には、スワッピングと例外の安全性はあまり重視されていませんでした。
bjarne はもともと (私の記憶が正しければ) 例外を望んでいましたが、1989 年かそこらになるまで言語に取り込まれませんでした。そのため、プログラミングの元の C++ の方法は、割り当てに重点を置いていました。失敗したコンストラクターが 0 を代入することによってその失敗を通知した程度までthis
… 、当時はあなたの質問は意味がなかったと思います。それはただの割り当てでした。
タイプごとに、いくつかのオブジェクトにはアイデンティティがあり、他のオブジェクトには値があります。値オブジェクトに代入することは理にかなっていますが、ID オブジェクトの場合は、通常、オブジェクトを変更できる方法を制限したいと考えています。これにはコピーの割り当てをカスタマイズする機能は必要ありませんが (使用不可にするためだけに)、その機能があれば他の言語サポートは必要ありません。
考えられる他の特定の理由についても同様だと思います。おそらく、そのような理由で一般的な能力が実際に必要になることはありませんが、一般的な能力はすべてをカバーするのに十分であるため、言語全体の複雑さが低下します。
私の勘、回想、直感よりも決定的な答えを得るための良い情報源は、bjarne の「c++ の設計と進化」の本です。
おそらく、質問には決定的な答えがあります。