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๋ฅผ ๋ฐํํ๋๋ก ๋ฐ๊พธ์.