Di gran lunga il motivo più importante per cui è fatto in questo modo è la coerenza.
Ecco come viene passato tutto il resto, quindi perché non anche le strutture e le classi?
Una delle principali giustificazioni per attenersi a questa coerenza è che in C e C ++ devi essere sempre attento alle indirette, (e quante di esse rappresentano una determinata variabile), quindi l'approccio generale adottato dalla lingua è di evitare di nascondersi indirette dal programmatore. In questo modo, tutto ciò che non è adornato con un '&' viene passato per valore, a meno che la funzione stessa non dichiari che l'argomento è un riferimento, nel qual caso non è necessario fornire "&" quando chiami e invece devi ricordare che c'è un '&' nella parte ricevente. (Ma tu hai fatto questa scelta, quindi hai portato su di te questo ulteriore carico mentale.)
Un'altra giustificazione è che se le strutture e le classi dovessero essere un'eccezione alla regola di passare tutto per valore, allora il linguaggio dovrebbe comunque darti un modo per specificare che in effetti vuoi una struttura / classe occasionale per essere passati per valore, e quindi quali brutte modifiche subirebbe la sintassi della lingua per facilitare questo? Il linguaggio ha già la sintassi per prendere un riferimento a qualcosa, ma non per trasmettere il valore di qualcosa.
Nota: il mio C ++ potrebbe essere un po 'arrugginito, quindi potrei aver fatto qualche piccolo errore o usare una parola un po' sbagliata per qualcosa. Se lo sai meglio, è del tutto possibile, ma invece di downvoting, modifica la risposta per correggere quell'errore minore.