오른쪽 값, 왼쪽 값 등의 미세 정의

2093 단어 C++C++11
glvalue, rvalue, lvalue, xvalue, prvalue라는 단어를 들어 본 적이 있다고 생각합니다. 흑마술사나 어둠의 군단 분들의 이야기에서는 은근하게 나오는 이 말입니다만, 보통은 세세한 정의를 파악하고 있는 것은 아니다고 생각합니다. 그래서 비망록적으로 메모 쓰기를 해두기로 했습니다.

신경이 쓰인 곳, 실수등 있으면 댓글을 주시면 다행입니다.

표현



공식. 우선 여기에서. C++의 모든 표현식은 어떤 값이며 객체 또는 포인터입니다.
1 + 2;  // expression ; an object
3;      // expression ; an object
func(); // expression ; an object
&func;  // expression ; a pointer

lvalue



왼쪽 값. 대입식의 왼쪽에 올 수 있는 값. 이 이름은 위의 이유로 관습적으로 붙은 것이지만, 당연히 우변에 오기도 한다.
int n = 0;
n = 1;     // n is lvalue.
int m = n; // n is lvalue.

int& func();
func() = 12;   // the result of func() is lvalue.

rvalue



오른쪽 값. 이것도 관습적으로 붙은 이름이지만, 기본적으로 좌변에 오지 않는다.
아래에 소개하는 xvalue와 prvalue로 분류할 수 있다.
int n = 0;            // 0 is rvalue ; prvalue
int m = std::move(n); // the result of std::move(n) is rvalue ; xvalue

prvalue



pure rvalue의 약자. 순수한 오른쪽 값. C++03까지는 모든 rvalue가 여기로 분류된다.
리터럴과 참조를 반환하는 함수를 제외한 함수의 반환 값이 여기에 분류됩니다.
int func();
func(); // the result of func() is prvalue.

xvalue



eXpiring value의 약자. 죽음의 값의 뜻으로, C++11부터는 좌변치를 우변치 참조에 캐스트 하는 것으로 일시 오브젝트와 같은 취급을 시킬 수가 있지만, 그러한 여명 선고를 한 오브젝트가 xvalue로 분류되어 한다. 이동 의미론의 가장 기본적인 개념.
int n = 0;
int m = static_cast< int&& >(n); // static_cast< int&& >(n) is xvalue.

int&& func();
func(); // the result of func() is xvalue.

glvalue



generalized lvalue의 약어, 종합 lvalue.
lvalue와 xvalue를 포함하는 개념. xvalue는 오른쪽 값 참조이고 오른쪽 값을 다루지 만 본질은 lvalue입니다.
따라서 lvalue와 xvalue를 총칭하여 glvalue라고합니다.
int n = 0;
n; // glvalue ; lvalue
std::move(n); // glvalue ; xvalue



N3337 3.10 그림 1의 copipe.

좋은 웹페이지 즐겨찾기