https://en.cppreference.com/w/cpp/language/value_category
C++의 value는 크게 glvalue와 rvalue로 구분된다.
glvalue에는 lvalue와 xvalue가 포함되며, rvalue에는 prvalue와 xvalue가 포함된다.
value의 두가지 특성
- identity 있음: expression이 다른 어떤 expression과 동일한 entity를 참조하는지의 여부를 알 수 있음. (그들이 식별하는 객체나 함수의 주소를 직간접적으로 비교함으로써)
- 이동 가능: 이동 생성자, 이동 대입 연산자, 혹은 그 외에 이동 시맨틱을 구현하기 위한 오버로딩 함수가 expression을 바인딩할 수 있음.
identity가 있는 value를 glvalue, 이동 가능한 value를 rvalue라고 한다.
이동 가능 | 이동 불가능 | ||
identity 있음 | xvalue | lvalue | glvalue |
identity 없음 | prvalue | 사용X | |
rvalue |
(C++17 이전)
glvalue는 lvalue-rvalue, 배열-포인터, 함수-포인터의 암시적 변환을 통해 prvalue로 암시적으로 변환될 수 있다.
glvalue는 다형성을 가질 수 있다. glvalue 객체의 동적 타입이 반드시 표현식의 정적 타입이 되지는 않는다. (?)
glvalue는 expression이 허용하는 경우 불완전한 타입을 가질 수 있다.
rvalue의 주소는 주소 연산자를 통해 얻어낼 수 없다.
&int(), &i++[3], &42, &std::move(x) 등은 허용되지 않는다.
rvalue는 대입 연산에서 좌측값으로 사용될 수 없다.
rvalue는 const lvalue 참조를 초기화하기 위해 사용될 수 있으며, 이 경우 rvalue 객체의 수명은 참조가 끝날 때까지 연장된다.
const lvalue 참조 매개변수와 rvalue 참조 매개변수를 가진 함수가 오버로딩 되어있는 경우 rvalue는 rvalue 참조에 바인딩된다. (따라서 복사 생성자와 이동 생성자를 모두 사용할 수 있는 경우 rvalue는 이동 생성자를 호출함)
entity: 단일의 식별 가능한 분리된 개체.
value, 객체, 참조, 구조화 바인딩, 함수, 열거자, 타입, 클래스 멤버, 템플릿, 템플릿 특수화, 매개변수 팩, 네임스페이스 포함. 전처리기 매크로는 C++의 entity가 아님
expression: 일련의 연산자와 피연산자, 계산을 열거함
expression의 값을 구하는 것은 side effect를 가져옴. ex) a=2+2의 값을 구하는 것이 a에 4가 저장되는 결과를 가져옴. printf(%d, 4)의 값을 구하는 것이 표준출력에 4가 출력되는 결과를 가져옴. (evaluate는 수학에서 값을 구하다라는 의미로 쓰임 특히 evaluate the expression이라고 하면 식의 값을 구하라는 뜻임)
expression은 두 가지의 독립된 특성을 가질 수 있는데, type과 value category임.
'Computer > C++' 카테고리의 다른 글
[C++] 템플릿 클래스만 쓰면 링크 에러가 나는 이유가 뭘까 (0) | 2022.11.26 |
---|---|
[C++] 스마트 포인터 클래스 (0) | 2022.11.20 |
[C++] rvalue 참조와 move semantics (0) | 2022.11.16 |
[C++] 함수 포인터 정리 (0) | 2022.11.11 |
[C++] 배열 포인터 정리 (0) | 2022.11.11 |