正当な理由はそれかもしれません
void foo(bar, xyzzy = 0);
オーバーロードのペアに似ています。
void foo(bar b) { foo(b, 0); }
foo(bar, xyzzy);
さらに、次のようにリファクタリングすると有利な場合があります。
void foo(bar b) { /* something other than foo(b, 0); */ }
foo(bar, xyzzy);
1つとして記述された場合でも、1つに2つの関数が含まれているようなものであり、どちらもどのような意味でも「優先」されません。1つの引数の関数を呼び出しています。2つの引数の1つは、事実上異なる関数です。デフォルトの引数表記は、それらを1つにマージするだけです。
オーバーロードが要求されている動作をする場合、一貫性を保つために、テンプレートが2つの定義に分割されている場合に機能する必要があります。推論は、呼び出されていない無関係の関数から型をプルすることになるため、それは意味がありません。また、実装されていない場合は、さまざまなパラメータリストの長さをオーバーロードすると、「デフォルトの引数」と比較して「二級市民」になることを意味します。
オーバーロードとデフォルトの違いがクライアントに完全に隠されていると便利です。