cpp_r_value - 8BitsCoding/RobotMentor GitHub Wiki

cpp_rvalue

๊ฐ’์˜ ๋ถ„๋ฅ˜

  • lvalue
  • rvalue

lvalue

  • ๋‹จ์ผ ์‹์„ ๋„˜์–ด ์ง€์†๋˜๋Š” ๊ฐœ์ฒด
    • ์ฃผ์†Œ๊ฐ€ ์žˆ์Œ
    • ์ด๋ฆ„์ด ์žˆ์Œ
    • const ๋ณ€์ˆ˜
    • ๋ฐฐ์—ด ๋ณ€์ˆ˜
    • ๋น„ํŠธ ํ•„๋“œ
    • ๊ณต์šฉ ๊ตฌ์กฐ์ฒด
    • ํด๋ž˜์Šค ๋งด๋ฒ„
    • ์ขŒ์ธก ๊ฐ’ ์ฐธ์กฐ(&)๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ
    • ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด
    • ๊ธฐํƒ€ ๋“ฑ๋“ฑ

rvalue

  • ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์ผ ์‹์„ ๋„˜์–ด ์ง€์†๋˜์ง€ ์•Š๋Š” ์ผ์‹œ์ ์ธ ๊ฐ’
    • ์ฃผ์†Œ๊ฐ€ ์—†๋Š” ๊ฐœ์ฒด
    • ๋ฆฌํ„ฐ๋Ÿด
    • ์ฐธ์กฐ๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ
    • i++, i-- (++i, --i๋Š” lvalue)
    • ๊ธฐ๋ณธ์œผ๋กœ ์ง€์›๋˜๋Š” ์‚ฐ์ˆ ์‹, ๋…ผ๋ฆฌ์‹ ๊ทธ๋ฆฌ๊ณ  ๋น„๊ต์‹
    • ์—ด๊ฑฐํ˜•(enum)
    • ๋žŒ๋‹ค(lambda)

rvalue ์ฐธ์กฐ (&&)

  • C++11์ดํ›„ ์ƒˆ๋กœ ๋‚˜์˜จ ์—ฐ์‚ฐ์ž
  • & : lvalue ์ฐธ์กฐ์— ์‚ฌ์šฉ
  • && : rvalue ์ฐธ์กฐ์— ์‚ฌ์šฉ

Example

float CalculateAverage()
{
    float average;
    // ...
    return average;
}

int main()
{
    int number = 10;
    int && rNumber = number;                    // Error number๋Š” lvalue
    int && rNumber1 = 10;                       // Ok
    float && rAverage = CalculateAverage();     // Ok
}

๊ทผ๋ฐ ์™œ ์“ฐ์ง€??

์šฐ์„  ์•„๋ž˜์˜ ๋ณต์‚ฌ ์ƒ์„ฑ์ž ์˜ˆ์‹œ๋ฅผ ๋จผ์ € ๋ณด์ž

class MyString
{
public:
    MyString(const MyString& other);
    // ...
};

MyString::MyString(const MyString& other) :
    mSize(other.mSize)
{
}
MyString studentName("Lulu");
MyString copiedName(studentName);

์œ„์™€ ๊ฐ™์ด ๋ณต์‚ฌ๋ฅผ ํ•˜์ง€๋ง๊ณ  ๊ทธ๋ƒฅ ์ฐธ์กฐ๋งŒํ•˜๋Š” ์ด๋™์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด??

MyString copiedName(studentName); lvalue์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ๋ฅผ ๋ง‰๊ณ  ์‹ถ์Œ!


์ด๋™ ์ƒ์„ฑ์ž

class MyString
{
public:
    MyString(MyString&& other);
    // ...
};

MyString::MyString(const MyString&& other) :
    mString(other.mString)
    ,mSize(other.mSize)
{
    // ๋ณต์‚ฌ ํ›„ ์›๋ณธ์€ ์ง€์šด๋‹ค.
    other.mString = nullptr;
    other.mSize = 0;
}
MyString studentName("Lulu");
MyString copiedName(std::move(studentName));
// std::move์“ฐ๋Š” ์ด์œ ๋Š” rvalue๋ฅผ ๋„˜๊ฒจ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์ด๋‹ค.
  • ๋‹ค๋ฅธ ๊ฐœ์ฒด ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋“ค์˜ ์†Œ์œ ๊ถŒ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ๋ณต์‚ฌ ์ƒ์„ฑ์ž์™€ ๋‹ฌ๋ฆฌ, ๋ฉ”๋ชจ๋ฆฌ ์žฌํ• ๋‹น์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ณต์‚ฌ ์ƒ์„ฑ์ž๋ณด๋‹ค ๋น ๋ฅด๋‹ค.
  • ์•ฝ๊ฐ™ ์–•์€ ๋ณต์‚ฌ์™€ ๋น„์Šท

์ด๋™ ๋Œ€์ž… ์—ฐ์‚ฐ์ž

class MyString
{
public:
    MyString& operator=(MyString&& other);
    // ...
};

MyString& MyString::operator=(MyString&& other)
{
    if(this != &other)
    {
        delete[] mString;

        mString = other.mString;
        mSize = other.mSize;

        other.mString = nullptr;
        other.mSize = 0;
    }

    return *this;
}
MyString studentName("Lulu");
MyString anotherstudentName("Teemo");

anotherstudentName = std::move(studentName);
  • ์ด๋™ ์ƒ์„ฑ์ž์™€ ๊ฐ™์€ ๊ฐœ๋…
  • ๋‹ค๋ฅธ ๊ฐœ์ฒด ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋“ค์˜ ์†Œ์œ ๊ถŒ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ์ด๊ฒƒ๋„ ๋ฉ”๋ชจ๋ฆฌ ์žฌํ• ๋‹น์„ ํ•˜์ง€ ์•Š์Œ
  • ์–•์€ ๋ณต์‚ฌ

rvalue ์ตœ์ ํ™”

  • ์šฐ๋ฆฌ๋ฅผ ํฅ๋ถ„์‹œํ‚จ ๋˜ ๋‹ค๋ฅธ C++์œ ํ–‰์–ด??
  • ๋„ˆ๋ฌด ์ข‹์€๋ฐ? ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์—†์ด? ์—„์ฒญ๋‚œ ์†๋„ํ–ฅ์ƒ์„ ๊ฐ€์ ธ์˜ค๊ฒ ๋‹ค!!
  • ํ•˜์ง€๋งŒ... ์‹ค์ œ rvalue๋ฐ˜ํ™˜์€ ๋งค์šฐ ๋А๋ฆฌ๋‹ค.
  • ๊ธฐ์กด ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๋ฐ˜ํ™˜ ๊ฐ’ ์ตœ์ ํ™”๋ฅผ ํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ...
  • ๋” ๋นจ๋ผ์ง„๋‹ค๊ณ  ์ž…์ฆ๋œ ๊ฒฝ์šฐ์—๋งŒ ํ•จ์ˆ˜๊ฐ€ rvalue๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋ฐ”๊พธ์ž.