C++ lvalue rvalue

By | 2022년 1월 22일
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);
Category: Qt

답글 남기기