2023.04.29 - [C++/기타] - [C++] lValue vs rValue (1)
에서 이어지는 글.
여기서 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++ > 기타' 카테고리의 다른 글
[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 |