-> ๊ทผ๋ณต์ ์ธ ์ฐจ์ด์ ์ remove_referenc_t ๋ using ์ฒ๋ฆฌ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋ณต์กํ๊ฒ typename์ ์์ฑํ ํ์ ์๋ค.
https://crmerry.tistory.com/113
class Test
{
public:
Test() { std::cout << "Constructor" << std::endl; }
~Test() { std::cout << "Destructor" << std::endl; }
Test(const Test& t)
{
std::cout << "Copy Constructor" << std::endl;
}
Test(Test&& t) noexcept
{
std::cout << "Move Constructor" << std::endl;
}
Test& operator=(const Test& t)
{
std::cout << "Copy =" << std::endl;
return *this;
}
Test& operator=(Test&& t) noexcept
{
std::cout << "Move =" << std::endl;
return *this;
}
};
: ํ ํ๋ฆฟ ํ์ ์ผ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ํ์ ์ ์ฐธ์กฐ๋ฅผ ์ ๊ฑฐํ๊ฒ ์!
์คํ
: 21๋ฒ์ค์ lvalue ์ด๊ธฐ ๋๋ฌธ์ rvalue 4 ๋ฐ์์ ์์.
: 23๋ฒ์ค์ rvalue ์ด๊ธฐ ๋๋ฌธ์ lvalue n์ ๋ฐ์ ์ ์์.
- ๋ชจ๋ ํ์ ์ ๋ฐ์ ์ ์๋๋ก template์ผ๋ก ๋ง๋ค์.
- move ์์ฑ์์ , move ๋์ ์ดํ์๋ rvalue๋ก ๋ฐํํจ. -> ํจ์ ๋ฐํํ์ ์ T&& ๋ก ํ์.
- move์ ์ธ์๋ก ๋ค์ด์ฌ์ ์๋ ๊ฒ์ lvalue, rvalue๋ชจ๋ ๊ฐ๋ฅํจ!
-> ํ์ ๋ชจ๋ ๋ฐ์ ์ ์๊ฒ forwarding ref ํ์ ์ผ๋ก ์ค์ ํ์.- ์ธ์๋ก ๋ค์ด์ค๋ ์ ๋ณด๋ฅผ rvalue๋ก ์บ์คํ ํ๋ ๊ฒ์ด๋ฏ๋ก.
-> static_cast<T&&> ๋ฐํ ํ์.- ํ์ง๋ง ์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ, lvalue๋ ํ ํ๋ฆฟ์ ๋ค์ด์ค๋ ์๊ฐ
์ง์ ํ๋ ๊ณณ์์ ref collapse๋ก ์ธํด์ static_cast<T&> ๋ก ๊ฒฐ์ ๋๋ค.
-> ์ฐธ์กฐ๋ฅผ ์ง์์ผ ํ๋ค. remove_reference_t ํจ์๋ฅผ ์ฌ์ฉํด ์ฐธ์กฐ ์ง์ฐ์.- ์ฐธ์กฐ์ฑ์ ์ง์ ์ผ๋๊น. ์ด์ rvalueํ์ ์ผ๋ก ๋ฐํํด์ผ ํ๋ฏ๋ก.
-> && ์บ์คํ ํ์.
template<typename T>
T&& xmove(T&& _obj)
{
return static_cast<remove_reference_t<T> &&>(_obj));
}
1) template์์ ์ธ์์์ ๋ฐ์๋ ๋ณต์ฌ ๋ฐ์ํ์ง ์๊ณ , rvalue์ lvalue๋ฅผ ๋ชจ๋ ๋ฐ์ ์ ์๋ ๊ฒ์
forwarding reference์ด๊ธฐ ๋๋ฌธ์ T&&๋ก template ์ธ์ ์ค์ ํ์.
(์ผ๋ฐ T๋ก ๋์ผ๋ฉด ๋ณต์ฌ ๋ฐ์ํ์์...)
-> T&& ๋ฅผ ํจ์ ์ธ์๋ก ํด์ ๋ง๋ค์
2) ๋ฐํ ํ์ ์ rValue ์ด๋ฏ๋ก , T&& ํ์ ๋ฐํํ์.
template <typename T> T&& xmove(T&& obj)
{
return static_cast<T&&>(obj)
}
int main()
{
Test t1;
Test t2 = t1; // => copy
Test t3 = xmove(t1); // => move ํ๋๋ฐ๋ copy ๋์ด.
Test t4 = xmove(Test()); // => move
}
Object a;
Object b = xmove(a);
template <typename T> T&& xmove(T&& obj)
{
return static_cast<remove_reference<T>::type &&>(obj);
}
<remove_reference < T >::type &&>
// T ํ์ ์ด ๊ฐ์ง๊ณ ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ ๊ฑฐํ๊ณ , &&๋ฅผ ๋ถ์ด๊ฒ ๋ค๋ ์๋ฏธ์.
template <typename T> T&& xmove(T&& obj)
{
return static_cast<typename remove_reference<T>::type &&>(obj);
}
template <typename T> typename remove_reference<T>::type&& xmove(T&& obj)
{
return static_cast<typename remove_reference<T>::type &&>(obj);
}
template <typename T> remove_reference_t<T>&& xmove(T&& obj)
{
return static_cast<remove_reference_t<T> &&>(obj);
}
: ์ด์ ํฌ์คํธ์์ move๋ฅผ ์ฌ์ฉํ๋ฉด lvalue ์ด๋๋ผ๋ ravlue๋ก ์บ์คํ ๋๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์๋๋ฐ, ์ง๊ธ์ ํฌ์คํธ์์ ์ด๋ฌํ ์ด์ ๋ฅผ ์์ ์๋ค.