One of the reasons for not substituting into empty slots when you use explicit parameters is that you might actually want an input to remain empty, and this is how you can do that.
The underlying central idea is that we should make easy things easy, like (( ) + 3), and also provide the standard thing (explicit parameters) for more advanced users to let them exercise fine control over what input goes where. For example, input substitution with multiple inputs works only if you use the inputs once each, in the same order in which you get them. So the equivalent of
can't be done by substitution into empty slots.