Смущает вопрос из книги Лафоре "ООП в С++"

В книге Роберта Лафоре в 5 главе столкнулся с интересным 18 вопросом. Вот как он звучит:

Когда аргумент передается в функцию по ссылке,

а) внутри функции создаётся переменная, хранящая значение этого аргумента;

б) функция не имеет доступа к значению аргумента;

в) в вызывающей программе создаётся временная переменная для хранения значения аргумента;

г) функция получает доступ к аргументу в вызывающей программе.

Я выбрал ответ а, потому что, как сказал автор:

Как мы видели, функция не имеет доступа к переменным аргументам, а работает со сделанными ей копиями.

а также

Важной особенностью передачи аргументов по ссылке является то, что функция имеет прямой доступ к значениям аргументов.

Но что ввело меня в полнейший ступор, так это то, что правильный ответ - г. Здесь есть какая-то тонкость или я что-то упустил?


Ответы (2 шт):

Автор решения: maestro

Как мы видели, функция не имеет доступа к переменным аргументам, а работает со сделанными ей копиями.

Это при передаче аргументов по значению (не по указателю, не по ссылке).

Важной особенностью передачи аргументов по ссылке является то, что функция имеет прямой доступ к значениям аргументов.

Это при передаче аргументов по ссылке или по указателю.

Именно из второй цитаты следует, что правильный ответ Г). Функция имеет прямой доступ к значениям аргументов, которые хранятся в теле вызывающей функции. То есть может их как читать, так и перезаписывать.

Вот пример:

int a(int b)
{
    b = 5; //Это никак не влияет на переменную b в функции main
    return b;
}

int main()
{
    int b = 1;
    a(b); //Аргумент передан по значению
    cout << b; //Будет выведено 1
    return 0;
}

Пример 2:

int a(int &b)
{
    b = 5; //Переменная b внутри функции main будет перезаписана
    return b;
}

int main()
{
    int b = 1;
    a(b); //Аргумент передан по ссылке
    cout << b; //будет выведено 5
    return 0;
}
→ Ссылка
Автор решения: ТарасПрограммер

Вы не различили цитаты. Здесь идет речь про две разные концепции (передача по значению и по ссылке).

Отсюда следует, что правильный ответ на вопрос это Г) функция получает доступ к аргументу в вызывающей программе.

Выводы - самый лучший вариант передачи аргумента в функцию - по ссылке(правда литералы не прокатят). Это особенно экономно, когда параметр - структура или класс.

→ Ссылка