C++/기타

[C++] LValue vs RValue (2)

sseram 2023. 5. 10. 22:24
반응형

2023.04.29 - [C++/기타] - [C++] lValue vs rValue (1)

 

[C++] LValue vs RValue (1)

맨 첨에 C를 어정쩡하게 배운 후에 C++ 사용하다 보니 애매하게 이해가 되기도 했고.. 지금도 어느 정도 쓰고 있긴 하지만 아직까지 제대로 감이 잡히지 않아, 공부하며 정리할 겸 남겨본다. https:/

donot-simsim.tistory.com

 

에서 이어지는 글.

 

 

여기서 lvalue, rvalue 에 대해 했으니, 이번 편에는 xvalue를 다뤄보자.

 

 

 

xvalue. glvalue와 rvalue의 특성을 모두 가지고 있다.

 

xvalue는 풀어서 쓰면 expiring value라고 한다. 즉 [곧 사라지는 값] 이다.

이 곧 사라지는 값인 xvalue은 두 가지의 특성이 있다.

 

 

1. 본인이 고유한 주소를 가지고 있다는 점.

2. 그 값을 이동 시킬 수 있다는 점.

 

 

이 글에서는 1번에 대해서 예시 코드를 통해 정리해 보았다.

 


 

#include <iostream>
#include <vector>

using namespace std;

vector<string> makeVec() {
	vector<string> vecStr = { "aa", "bb", "cc" };

	return vecStr;
}

int main() {
	makeVec();

	return 0;
}

 

 

위 코드에서 makeVec 함수를 이용하여 xValue를 만들어 보았다.

 

makeVec 함수에서는 vecStr이라는 vector string을 하나 만들고 return시켜 준다.

그러면 해당 값은 분명히 주소가 있고, 그 안에 실제 값도 있다.

하지만 makeVec()이라는 함수 선언부를 지나가는 순간 사용할 수가 없어진다.

 

여기서

 

 

1.

#include <iostream>
#include <vector>

using namespace std;

vector<string> makeVec() {
	vector<string> vecStr = { "aa", "bb", "cc" };
	return vecStr;
}

int main() {
	cout << makeVec()[1] << endl;
	cout << makeVec().size()<< endl;
	return 0;
}

 

이런 식으로 넘어온 값을 가지고 여러 가지 표현이 가능하다.

 

 

그리고

2.

#include <iostream>
#include <vector>

using namespace std;

vector<string> makeVec() {
	vector<string> vecStr = { "aa", "bb", "cc" };
	return vecStr;
}

int main() {
	makeVec() = { "aaa" };
	return 0;
}

 

 

실제로 주소를 가지고 있기 때문에, 해당 주소에 어떠한 값을 대입할 수도 있다. 다만 해당 라인이 끝나면 수명이 다해 사라지게 된다.

 

 

 

1, 2를 정리해 보면 위를 정리하면

 

- 실제 메모리상에 주소를 가지고 있기 때문에 값을 대입할 수도 있다.

- 그 값이 가지고 있는 여러 메소드들도 사용이 가능하고, 그 안에 있는 값도 가져 올 수 있다.

 

 

xvalue 본인이 고유한 주소를 가지고 있다.

다만 곧 사라질 뿐..

 

 

 

추가로, 고유한 주소를 가지고 있다 보니 이런 괴상한 짓도 가능하다.

 

#include <iostream>
#include <vector>

using namespace std;

vector<string> makeVec() {
	vector<string> vecStr = { "aa", "bb", "cc" };
	return vecStr;
}

int main() {
	makeVec() = makeVec();
	return 0;
}

 

2번째 특성은 다음 글에서...

 

 

2023.05.15 - [C++/기타] - [C++] LValue vs RValue (3)

 

[C++] LValue vs RValue (3)

2023.05.10 - [C++/기타] - [C++] LValue vs RValue (2) [C++] LValue vs RValue (2) 2023.04.29 - [C++/기타] - [C++] lValue vs rValue (1) [C++] LValue vs RValue (1) 맨 첨에 C를 어정쩡하게 배운 후에 C++ 사용하다 보니 애매하게 이해가

donot-simsim.tistory.com

 

반응형

'C++ > 기타' 카테고리의 다른 글

[C++17] if constexpr  (1) 2023.05.17
[C++] LValue vs RValue (3)  (1) 2023.05.15
[C++] LValue vs RValue (1)  (0) 2023.04.29
[C++ 11] 정규 표현식 std::regex (2)  (0) 2023.04.23
[C++ 11] 정규 표현식 std::regex (1)  (0) 2023.04.23