일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 유니티
- 소스코드 줄번호
- 유니티 Rotate
- 유니티 시야 가림
- 너비 우선 탐색
- LayerMask
- 코드블럭 테마
- 깊이 우선 탐색
- git-lfs
- ML-Agents
- Raycast
- c++
- InputManager
- Mathf.Clamp
- unity
- LFS
- 유니티 머신러닝
- eulerAngles
- LookRotation
- 유니티 ResourceManager
- 유니티 Vector3
- 이진트리
- 유니티 리소스매니저
- Quaternion.Euler
- 알고스팟
- 유니티 InputManager
- 유니티 Collision
- 유니티 오브젝트 풀링
- 오브젝트 풀링
- c++ 문자열 자르기
- Today
- Total
무민은귀여워
rvalue 참조 본문
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 |