Компилятор C++ автоматически создаёт временные переменные, когда передаёшь аргументы функциям с параметрами типа const reference. Это происходит в двух конкретных случаях:
Когда переданный аргумент имеет нужный тип, но не является lvalue (переменной с постоянным адресом в памяти), компилятор генерирует временную переменную.
Пример:
double Cube(const double & num) {
return num * num * num;
}
double temp = 2.0;
double value = Cube(3.0 + temp); // аргумент — это выражение, а не lvalue
В этом случае выражение 3.0 + temp создаёт безымянную временную переменную, которая хранит результат перед передачей в функцию.
Когда переданный аргумент имеет другой тип, но его можно неявно преобразовать в нужный тип, компилятор создаёт временную переменную для хранения преобразованного значения.
Пример:
double cuberoot(const double & num) {
return /* вычисление */;
}
long temp = 3L;
double value = cuberoot(temp); // преобразование long в double
Тут значение long преобразуется в double, и временная переменная хранит это преобразованное значение во время вызова функции.
Такое автоматическое поведение гарантирует, что параметры const reference могут безопасно принимать и lvalue, и rvalue — без того, чтобы вызывающий код создавал явные временные переменные. Временная переменная живёт всё время выполнения функции, позволяя const reference безопасно к ней привязаться.
Временная переменная создается при передаче аргумента, который не является lvalue, в функцию с параметром const reference, даже если аргумент уже имеет требуемый тип.
Новый — ещё не проверен сообществом
Вы