Temporary Variable
임시 변수
- 실제 매개변수와 참조 매개변수간에 데이터형이 일치하지 않을 경우 생성되는 변수이다.
- \(\texttt{const}\) 참조 데이터형의 매개변수일 경우에만 한정하여 임시 변수를 생성한다.
- 임시 변수는 함수가 호출되어 있는 동안에만 유지되며 그 후에는 컴파일러가 마음대로 제거할 수 있게된다.
* 컴파일러는 참조 매개변수가 \(\texttt{const}\)형 일 경우, 아래 두 가지 상황에서 임시변수를 생성한다.
1. Argument(실제 매개변수)가 올바른 데이터형이지만 L-Value가 아닌 경우
2. Argument(실제 매개변수)가 잘못된 데이터형이지만 올바른 데이터형으로 변환 가능한 경우 (어느정도 같은 범주안에 있는 데이터)
따라서, \(\texttt{const}\) 참조 매개변수가 올바른 데이터형이며 L-Value이면 임시변수가 생성되지 않고,
그 이외의 경우에는 임시변수가 생성되는 것이며 그 임시 변수에 함수의 실제 매개변수의 값을 대입하고, 매개변수가 그임시 변수를 참조하게 되는 것이다.
Ex. Argument가 임시 변수인 경우와 그렇지 않은 경우 예시
double refCube (const double* ra); // 매개변수를 세제곱한 값을 리턴하는 함수
double side = 3.0
double* pd = &side;
double& rd = side;
long edge = 5L; // Long-Double Type을 의미하는 Postfix 'L' (=올바른 데이터형이 아님을 의미)
double lens[4] = {2.0, 5.0, 10.0, 12.0};
// 임시변수가 생성되는 경우 (Argument가 올바른 데이터형이 아니거나, L-Value가 아닌 경우)
double c1 = refCube(edge);
double c2 = refCube(7.0);
double c3 = refCube(side + 10.0);
// 임시변수가 생성되지 않는 경우 (Argument가 올바른 데이터형이며 L-Value인 경우)
double c4 = refCube(side);
double c5 = refCube(lens[2]);
double c6 = refCube(rd);
double c& refCube(*pd);
L-Value Parameter (Left Hand-side Value)
- 참조가 가능한 데이터 객체의 집합을 의미한다.
- 본래 C에서 대입문 왼편에 나타낼 수 있는 독립체들을 칭하던 용어였다.
- \(\texttt{&}\) 연산자로 주소를 구할 수 있는 데이터 객체를 의미하며,
주소를 구할 수 없거나 표현식이 지나고 다시 접근할 수 없는 것은 L-Value가 아니다. (그것을 R-Value라 부른다.)
ex) 변수, 배열 원소, 구조체의 멤버, 참조 또는 역참조 포인터 등이 L-Value에 해당된다.
- L-Value는 이름이 부여된다는 점이 R-Value와 가장 대비되며 따라서 프로그래밍적으로 제어가 가능하며,
R-Value는 이름이 없어 해당 표현식이 지나면 사라지는 임시값이며 이로인해 프로그래밍적인 제어가 불가능하다.
(단, R-Value Reference에 의해 L-Value처럼 접근할 수 있게하는 방법이 있다.)
R-Value Parameter (Right Hand-side Value)
- 일반 상수, 여러 개의 항으로 이루어진 표현식과 같이 L-Value에 해당되지 못하는 데이터 객체들을 의미한다.
- 잠깐 사용되고 사라지는 "임시값"의 의미를 갖는다.
- 일반 상수의 경우 주소에 의해서 표시되는 인용 구문의 경우에는 L-Value에 해당된다.
- C++11부터는 R-Value Reference라고 하는 기능이 생겼으며, R-Value를 참조할 때 사용할 수 있고, \(\texttt{&&}\) 연산자를 사용한다.
- R-Value 참조는 Library 디자인에서 특정 기능을 더 효율적으로 구현할 수 있게 한다. (move semantic 등등)
double&& rref = std::sqrt(36.00); // double& 형은 허용되지 않는다.
double j = 15.0;
double&& jref = 2.0*j + 18.5; // double& 형은 허용되지 않는다.
임시 변수와 Call by Value
- 매개변수를 임시 변수를 통해 받는다는 것은 그 자체로 Call by Value의 성격을 띄는 것을 의미한다.
- 즉, 매개변수가 참조형일지라도, 함수가 호출될 때 임시변수가 생성되면 해당 매개변수의 원본 값은 변하지 않음을 의미한다.
- 따라서, 참조 매개변수를 가진 함수의 목적이 원본 데이터의 수정에 있다면, 임시 변수의 생성은 그 목적을 방해할 것이고 이를 해결하는 방법으로는 임시 변수의 생성을 허용하지 않음에 있다. (최근 C++ 표준에서는 이점을 준수하고 있다.)