std::moveとstd::forwardコード分析

5011 ワード

前のブログでは、モバイルの意味と完璧な転送とは何かを知りました.その間、2つの新しいstd関数:std::moveとstd::forwardを使用しました.
  • std::moveの役割:左の値を右の値
  • に変換する
  • std::forwardの役割:実パラメータの左右値属性を実パラメータ転送時に完全に保持します.

  • モバイルの意味と完璧な転送を理解した後、std::moveとstd::forwardの2つの関数の内部実装を探究する必要があります.これはC++テンプレートに関する基本的な知識が必要です.
    1.テンプレートのタイプ推定、右参照の特殊タイプ推定ルール
    2.実パラメトリック転送
    3.共通参照
    まず共通参照といえば、これはScott Meyersが創始した言葉で、通俗的に言えば、共通参照はこのようなものです:それは左値と右値をバインドすることができて、コードの中で一般的に長いこの様子:T&.共通参照には2つの条件があります.
  • は、constなどの修飾を加えることなく、「T&&」という形式を正確に満たさなければならない.
  • Tは、最も一般的なテンプレートパラメータなどの推定によって得られる必要がある.

  • 4.参照の折りたたみ
    C++テンプレートのタイプ導出(Type Decuction)中の「参照折りたたみ」ルール:
  • T& & => T&
  • T&& & => T&
  • T& && => T&
  • T&& && => T&&

  • 5. static_cast
    6.無名右値参照、具名右値参照
    stdテンプレートライブラリのforwardとremove_referenceの実装
    //std::remove_reference   
    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}
    
    //std::move   
    template<typename T>
    typename std::remove_reference<T>::type&&  move(T&& arg){ 
        return static_cast<typename std::remove_reference<T>::type&&>(arg); 
     }
    
    //std::forward   
    template <typename T>
    T&& forward(typename remove_reference<T>::type& arg){
    	return static_cast<T&&>(arg);
    }
    

    C++テンプレートのいくつかの奇抜なテクニックを理解した後、私たちは見苦しくありません.move関数は何もしていません.ただ、左の値または左の値の参照をコンパイル期間中に右の値の参照に変換します.forward関数は,参照折り畳み規則を用いて,実パラメータが左値参照であるか右値参照であるかという情報を戻り値として保持する.
    簡単に言えばstd::moveとstd::forwardはコンパイル中にタイプ変換の作業をしただけです.moveは右の値の参照を返し、forwardは左の値の参照または右の値の参照を返します(パラメータは左の値(参照)は左の値の参照を返し、右の値(参照)は右の値の参照を返します).実行期間のコードはありません.