引用摺疊規則和move和forward

  • int & & 摺疊爲 int&
  • int & && 摺疊爲 int&
  • int && & 摺疊爲 int&
  • int && && 摺疊爲 int &&

move原理

C++高階知識:深入分析移動構造函數及其原理

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方法後,變成了右值引用,右值引用是左值,你再將這個引用傳入原方法就出問題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章