С++ для начинающих




Подробнее о точном соответствии - часть 2


   return 0;

}

В первом операторе присваивания переменная lval – это l-значение, а литерал 5 – r-значение. Во втором операторе присваивания res – это l-значение, а временный объект, в котором хранится результат, возвращаемый функцией calc(), – это r-значение.

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

int obj1;

int obj2;

int main() {

   // ...

   int local = obj1 + obj2;

   return 0;

}

Здесь obj1 и obj2 – это l-значения. Однако для выполнения сложения в функции main() из переменных obj1 и obj2 извлекаются их значения. Действие, состоящее в извлечении значения объекта, представленного выражением вида l-значение, называется преобразованием l-значения в r-значение.

Когда функция ожидает аргумент, переданный по значению, то в случае, если аргумент является l-значением, выполняется его преобразование в r-значение:

#include <string>

string color( "purple" );

void print( string );

int main() {

   print( color );    // точное соответствие: преобразование lvalue

                      // в rvalue

   return 0;

}

Так как аргумент в вызове print(color) передается по значению, то производится преобразование l-значения в r-значение для извлечения значения color и передачи его в функцию с прототипом print(string). Однако несмотря на то, что такое приведение имело место, считается, что фактический аргумент color точно соответствует объявлению print(string).

При вызове функций не всегда требуется применять к аргументам подобное преобразование. Ссылка представляет собой l-значение; если у функции есть параметр-ссылка, то при вызове функция получает l-значение. Поэтому к фактическому аргументу, которому соответствует формальный параметр-ссылка, описанное преобразование не применяется. Например, пусть объявлена такая функция:

#include <list>

void print( list<int> & );

В вызове ниже li – это l-значение, представляющее объект list<int>, передаваемый функции print():




Содержание  Назад  Вперед