1 분 소요

1. Value 카테고리

  • lvalue : lvalue reference return
  • rvalue : rvalue reference return, value return
    • rvalue reference return : xvalue
    • value return : prvalue

2. Value 별 특징

  • cppreference
  • lvalue : copy, polymorphic , Id
  • xvalue : move, polymorphic , Id
  • prvalue : move, non-polymorphic , no Id

  • glvalue : lvalue + xvalue
  • rvalue : xvalue + prvalue

Capture

3. 코드로 알아보기

#include <iostream>
using namespace std;

int x = 0;
int     f1() { return x; }
int&    f2() { return x; }
int&&   f3() { return move(x); }

int main()
{
    f1() = 10; // error , value return
    f2() = 20; // ok    , lvalue ref return
    f3() = 30; // error , rvalue ref return
}
#include <iostream>
using namespace std;

struct Base {
    virtual void foo() { cout << "B::foo" << "\n"; }
};

struct Derived : public Base {
	virtual void foo() { cout << "D::foo" << "\n"; }
};

Derived d;
Base    f1() { return d; }
Base&   f2() { return d; }
Base&&  f3() { return move(d); }

int main()
{
    Base b1 = f1(); // 임시객체, move
    Base b2 = f2(); // copy
    Base b3 = f3(); // move

    f1().foo(); // B::foo, value return		 , 임시객체이므로 Base foo 호출
    f2().foo(); // D::foo, lvalue ref return , 이름을 가지므로 Derived foo 호출
    f3().foo(); // D::foo, rvalue ref return , 이름을 가지므로 Derived foo 호출
}

참고

codenuri 강석민 강사 강의 내용기반으로 정리한 내용입니다.
코드누리
cppreference


This is personal diary for study documents.
Please comment if I'm wrong or missing something else 😄. 

Top

댓글남기기