int & &
摺疊爲int&
int & &&
摺疊爲int&
int && &
摺疊爲int&
int && &&
摺疊爲int &&
move原理
namespace whz {
template<typename T>
struct remove_reference {
typedef T type;
};
template<typename T>
struct remove_reference<T&> {
typedef T type;
};
template<typename T>
struct remove_reference<T&&> {
typedef T type;
};
template<typename T>
typename remove_reference<_Tp>::type&& move(T &&t) {
typedef typename whz::remove_reference<T>::type ty;
return static_cast<ty &&>(t);
}
}
forward完美轉發
std::forward被稱爲完美轉發,它的作用是保持原來的值屬性不變。
啥意思呢?通俗的講就是,如果原來的值是左值,經std::forward處理後該值還是左值;如果原來的值是右值,經std::forward處理後它還是右值。
ps.完美轉發要與通用引用模板配合使用
template<typename T>
void print(T &t) {
std::cout << "左值" << std::endl;
}
template<typename T>
void print(T &&t) {
std::cout << "右值" << std::endl;
}
template <typename T>
T&& forward(typename std::remove_reference<T>::type& param)
{
std::cout << "&" << std::endl;
return static_cast<T&&>(param);
}
template <typename T>
T&& forward(typename std::remove_reference<T>::type&& param)
{
std::cout << "&&" << std::endl;
return static_cast<T&&>(param);
}
template<typename T>
void testForward(T &&v) { // 配合通用引用
print(v);
print(::forward<T>(v));
print(std::move(v));
}
右值引用是左值
這也是爲什麼需要完美轉發,你寫一個wrapper去做一個靜態代理,原本可能傳入形參的是右值,但是你將這個右值傳入wrapper方法後,變成了右值引用,右值引用是左值,你再將這個引用傳入原方法就出問題了。