stl std::forward

2503 ワード

機能:
テンプレートに使用されるプロキシ関数のパラメータ転送は、パラメータの実際のタイプを維持できます.
例:
#include 
#include 

void add(int& a, int&& b, int c, int *d) {
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << c << std::endl;
    std::cout << *d << std::endl;
}

void add_proxy(int &a, int &&b, int c, int *d) {
    add(a, std::move(b), c, d);
}

template
void proxy_template(fun f, A&& a, B&& b, C&& c, D&& d) {
    f(std::forward(a), std::forward(b), std::forward(c), std::forward(d));
}
int main() {
int a = 1;
add_proxy(a, 2, 3, &a);
proxy_template(add, a, 2, 3, &a);
return 0;
}
add_Proxyは明確なタイプの手動エージェントに呼び出されます
proxy_templateはテンプレートタイプの4パラメータメソッドエージェント呼び出しであり、渡されたパラメータがタイプにかかわらず、実際のタイプに従って転送できます.
std::forwardソース:
  template
    constexpr _Tp&&
    forward(typename std::remove_reference<_tp>::type& __t) noexcept
    { return static_cast<_tp>(__t); }

forwardの場合は1つのみ、type&&_t,forwardに渡す右の値の場合,ここではしばらくは使えない.
説明:
A&&aは、実パラメータint aを伝達し、テンプレートパラメータaをint&&&&a(引用折りたたみ)->int&aとするので、A=int&,a=int&
std::forward (a)->std::forward(int&), std::remove_reference::type->intなので、上のstd::forwardソースコードに一致します。
std::remove_reference::type&->int&
最終コードは次のとおりです.
constexpr int& &&forward(std::remove_reference::type& __t) noexcept {return static_cast(__t):}
constexpr int& forward(std::remove_reference::type& __t) noexcept {return static_cast(__t);}
テンプレートに渡されるのは左ですが、渡されるのは左ですか.
B&&b,伝達3,導出テンプレートパラメータbはint&&&bであるため,B=int,b=int&&
std::forward(b)->std::forward(int&)(b=int&&&と呼ばれていますが、右値参照と呼ばれていますが、一時変数にアクセスできる参照であることを示しているだけで、その後使用する場合、それ自体が左値として使用されます)、
std::remove_reference::type->intなので、上のstd::forwardソースコードに一致します.
std::remove_reference::type&->int&
最終コード:
constexpr int&& forward(std::remove_reference::type& __t) noexcept { return static_cast(__t);}
つまり、テンプレートに渡される値は右ですが、渡される値は右ですか.
CとBが一致する
Dは実際にint*に渡され,int*全体を左の値として見るとAと一致する.