Программирование. Принципы и практика использования C++ Исправленное издание, стр. 117
Такие программы часто используют передачу по ссылке или по константной ссылке. Если передача по ссылке используется только для того, чтобы избежать копирования, следует использовать константную ссылку. Следовательно, если мы видим аргумент, передаваемый по обычной ссылке, то это значит, что существует функция, изменяющая этот аргумент. Иначе говоря, если мы видим аргумент, передаваемый по ссылке, не являющейся константной, то должны прийти к выводу, что эта функция не только может, но и обязана модифицировать этот аргумент. Таким образом, мы обязаны тщательно проверить, действительно ли эта функция делает то, для чего предназначена.
8.5.7. Проверка аргументов и преобразование типов
Передача аргумента представляет собой инициализацию формального аргумента функции фактическим аргументом, указанным при ее вызове. Рассмотрим пример.
void f(T x);f(y);T x=y; // инициализация переменной x значением переменной y // (см раздел 8.2.2)Вызов
f(y)T x=y;xvoid f(double);void g(int y){ f(y); double x(y); // инициализируем переменную x значением // переменной y (см. раздел 8.2.2)}Обратите внимание на то, что для инициализации переменной
xyintdoublef()doublef()x
doubleintvoid ff(int);void gg(double x){ ff(x); // как понять, имеет ли это смысл?}Если вы действительно хотите усечь значение типа
doubleintvoid ggg(double x){ int x1 = x; // усечение x int x2 = int(x); ff(x1); ff(x2); ff(x); // усечение x ff(int(x));}Таким образом, следующий программист, просматривая этот код, сможет увидеть, что вы действительно думали об этой проблеме.
8.5.8. Реализация вызова функции
Как же на самом деле компилятор выполняет вызов функции? Функции
expression()term()primary()tsToken_streamtsToken_stream&Во-первых, функция expression() совершенно очевидна; она имеет один аргумент (
tslefttdouble expression(Token_stream& ts){ double left = term(ts); Token t = ts.get(); // ...}Во-вторых, функция
term()expression()dcase '/'double term(Token_stream& ts){ double left = primary(ts); Token t = ts.get(); // ... case '/': { double d = primary(ts); // ... } // ...}В-третьих, функция
primary()term()leftdouble primary(Token_stream& ts){