무민은귀여워

rvalue 참조 본문

IT/c, c++

rvalue 참조

moomini 2019. 7. 12. 16:49
반응형
 lvalue  표현식이 종료된 이후에도 없어지지 않고 지속되는 개체 (예: 모든 변수)
 rvalue  표현식이 종료되면 더 이상 존재하지 않은 임시적인 개체 (예: 상수, 임시 객체)

 

Q.  Lvalue인지 Rvalue인지 헷갈린다면?

주소 연산자 &를 붙여서 에러가 나면 Rvalue

 

1
2
&(++x);
&(x++); // error C2102: '&' requires l-value
cs

 

* Lvalue Reference : Lvalue만 참조 가능 / Rvalue Reference : Rvalue만 참조 가능

 

1
2
3
4
5
6
7
8
9
10
11
12
13
int rvalue()
{
return 10;
}
int main()
{
int lvalue = 10;
int& a = lvalue;
int& b = rvalue(); // error C2440
int&& c = lvalue; // error C2440
int&& d = rvalue();
}
 
cs

 


현재 lvalue 참조라고 불리는 전통전인 c++ 참조는 식별자를 lvalue에 대입한다.

lvalue는 변수 이름이나 역참조 포인터와 같은 표현식을 의미하며, 프로그램이 주소를 얻기 위해 데이터를 대신하는 것이다.

 

1
2
3
4
5
6
int n;
int * pt = new int;
const int b = 101;        // b에 대입 불가능. &b는 가능함
int & rn = n;            // n은 &n 주소에 있는 데이터를 확인한다. 
int & rt = *pt;            // *pt는 pt주소에 있는 데이터를 확인한다.
const int & rb = b;        // b는 &b에 있는 상수 데이터를 확인한다.
cs

 

c++11에서는 rvalue 참조를 추가했다. &&로 사용하며 rvalue에 값을 대입한다. 즉, 값은 대입문의 오른쪽에 나타나지만 주소 연산자를 적용하기 위한 것은 아니다.

 

다음 예제는 리터럴 상수(c스타일 문자와는 별개로, 주소로 해석되는 곳), x+y와 같은 표현식, 그리고 rvalue를 반환하는 함수, 참조를 반환하지 않는 함수를 포함한다.

 

1
2
3
4
5
int x = 10;
int y = 23;
int && r1 = 13;
int && r2 = x + y;
double && r3 = std::sqrt(2.0);
cs

 

r2가 어떤값이 될지는 x+y가 계산되는 시점에 결정된다는 것에 주목해야 한다.

즉, r2의 값은 23이 되고 r2는 x나 y값이 변하는 데 영향을 미치지 않는다.

 

흥미로운 점은 rvalue 참조에 rvalue를 대입하면 주소가 가리킼는 위치에 그 값이 저장된다.

다시말해 & 연산자에 13이라고 대입하지 않아도 r1에 그 값이 적용된다.

특정 주소에 대입된 데이터는 rvalue 참조를 통해 데이터를 접근할 수 있다.

 

[ 예제 ]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
using namespace std;
 
inline double f(double tf) { return 5.0 * (tf - 32.0/ 9.0; };
 
int main()
{    
    double tc = 21.5;
    double&& rd1 = 7.07;
    double&& rd2 = 1.8 * tc + 32.0;
    double&& rd3 = f(rd2);
 
    cout << " tc value and address: " << tc << ", " << &tc << endl;
    cout << "rd1 value and address: " << rd1 << ", " << &rd1 << endl;
    cout << "rd2 value and address: " << rd2 << ", " << &rd2 << endl;
    cout << "rd3 value and address: " << rd3 << ", " << &rd3 << endl;
 
    cin.get();
    
    return 0;
}
cs

 

[ 결과 ]

 

1
2
3
4
 tc value and address: 21.5, 000000384F35FAF8
rd1 value and address: 7.07, 000000384F35FB38
rd2 value and address: 70.7, 000000384F35FB78
rd3 value and address: 21.5, 000000384F35FBB8
cs

 

 

[ c++ 기초플러스 6판 p1474 ]


=> 메모 &&

Move Semantics 내용으로 이어짐 -> 나중에 다시 알아보기

 

기존의 레퍼런스의 문제를 해결하기 위함

func(10) 오류. 참조를 할 수 없음 
Func2(A()) 오류. 실제 변수가 아니므로 참조 불가능 

void func(int&& value) 

void func2(A&& value)

반응형

'IT > c, c++' 카테고리의 다른 글

[c++] next_permutation 조합 구하기  (0) 2019.11.20
cgame 프레임워크  (0) 2019.07.16
error) c4996 에러 #pragma warning(disable:4996)  (0) 2019.07.12
memo) 바이트 패딩  (0) 2019.07.12
널 포인터 ( nullptr )  (0) 2019.07.12
Comments