Call-by-value и call-by-reference - это методы реализации, которые давно были приняты за режимы передачи параметров.
В начале был Фортран. У FORTRAN был только вызов по ссылке, поскольку подпрограммы должны были иметь возможность изменять свои параметры, а вычислительные циклы были слишком дорогими, чтобы разрешать множественные режимы передачи параметров, плюс было недостаточно известно о программировании, когда был впервые определен FORTRAN.
Алгол придумал вызов по имени и вызов по значению. Вызов по значению был для вещей, которые не должны были быть изменены (входные параметры). Вызов по имени был для выходных параметров. Обращение по имени оказалось крупным черепком, и АЛГОЛ 68 сбросил его.
PASCAL предоставил вызов по значению и вызов по ссылке. Это не дало программисту никакого способа сообщить компилятору, что он передает большой объект (обычно массив) по ссылке, чтобы избежать перебора стека параметров, но что объект не должен изменяться.
PASCAL добавил указатели в лексикон языкового дизайна.
C предоставил вызов по значению и смоделировал вызов по ссылке, определив оператор kludge для возврата указателя на произвольный объект в памяти.
Более поздние языки копировали C, в основном потому, что дизайнеры больше ничего не видели. Вероятно, поэтому так важен call-on-value.
C ++ добавил Kludge поверх C-Kludge, чтобы обеспечить вызов по ссылке.
Теперь, как прямой результат «вызов по значению», «вызов по ссылке» и «вызов по указателю-kludge», C и C ++ (программисты) испытывают ужасные головные боли с указателями на const и указателями на const (только для чтения) объекты.
Аде удалось избежать всего этого кошмара.
Ада не имеет явного вызова по значению против вызова по ссылке. Скорее, Ада имеет входящие параметры (которые могут быть прочитаны, но не записаны), выходные параметры (которые ДОЛЖНЫ быть записаны до того, как их можно будет прочитать) и выходные параметры, которые могут быть прочитаны и записаны в любом порядке. Компилятор решает, будет ли определенный параметр передан по значению или по ссылке: он прозрачен для программиста.
void acceptEntireProgrammingLanguageByValue(C++);