Table of Contents
C++ lvalue rvalue
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . .
lvalue rvalue
int main()
{
int x, y;
x = 0; // x 는 lvalue, 0 은 rvalue 입니다.
y = x + 1; // y 는 lvalue, x+1 은 rvalue 입니다.
}
reference 와 rvalue
- 상수의 reference를 만들 수 없습니다.
- 임시객체의 reference를 만들 수 없습니다.
- 단, const reference는 상수나 임시객체를 가르킬 수 있습니다.
struct X {
int member;
};
X foo() {
X x;
return x; // 함수가 객체를 값으로 리턴하면 임시 객체가 리턴됩니다.
}
int main() {
int n = 10;
int& r1 = n; // (A) ok.. n은lvalue 입니다.
int& r2 = n + 1; // (B) error
int& r3 = 5; // (C) error. 상수
X& r4 = foo(); // (D) error. 임시객체
X& r5 = X(); // (E) error. 역시X의 임시객체를 만들고 있습니다.
const int& r6 = 5; // (F) ok. const & 상수를 가리킬 수 있습니다.
const X& r7 = foo(); // (G) ok. const & 임시 객체 를 가리킬 수 있습니다.
}
VC++2005/2008의 경우는 자체의 확장 문법 때문에 (D), (E)가 에러가 발생하지 않습니다.
하지만, ++ 표준에 의하면 분명이 에러입니다.
reference of reference
참조의 참조를 이용하면 오류를 피할 수 있습니다.
test->SetTitle(QString("Hello, World!")); // error
QString && str = QString("Hello, World!"); // ok
test->SetTitle(str);