Kiedy używać argumentów std:: forward do forward?

C++0x pokazuje przykład użycia std::forward:

template<class T>
void foo(T&& arg) 
{
  bar(std::forward<T>(arg));
}

Kiedy korzystnie jest używać std::forward, zawsze?

Ponadto, wymaga użycia && w deklaracji parametrów, czy jest ona ważna we wszystkich przypadkach? Myślałem, że trzeba przejść do funkcji, jeśli funkcja jest zadeklarowana z && w niej, więc czy foo może być wywołane z dowolnym parametrem?

Wreszcie, jeśli mam wywołanie funkcji takie jak to:

template<int val, typename... Params>
void doSomething(Params... args) {
  doSomethingElse<val, Params...>(args...);
}

Powinienem użyć tego zamiast:

template<int val, typename... Params>
void doSomething(Params&&... args) {
  doSomethingElse<val, Params...>(std::forward<Params>(args)...);
}

Również, jeśli używasz parametry dwukrotnie w funkcji, tzn. przekazywanie do dwóch funkcji jednocześnie, czy rozsądne jest użycie std::forward? Czy std::forward nie przekonwertuje dwukrotnie tej samej rzeczy na tymczasową, przesuwając pamięć i czyniąc ją nieważną na drugie użycie? Czy następujący kod będzie ok:

template<int val, typename... Params>
void doSomething(Params&&... args) {
  doSomethingElse<val, Params...>(std::forward<Params>(args)...);
  doSomethingWeird<val, Params...>(std::forward<Params>(args)...);
}

Jestem trochę zdezorientowany std::forward, i chętnie skorzystam z jakiegoś sprzątania.

Author: Dev Null, 2011-08-31

1 answers

Użyj go jak pierwszego przykładu:

template <typename T> void f(T && x)
{
  g(std::forward<T>(x));
}

template <typename ...Args> void f(Args && ...args)
{
  g(std::forward<Args>(args)...);
}

Wynika to z referencji : If T = U&, then T&& = U&, ale if T = U&&, then {4]}, więc zawsze kończysz z prawidłowym typem wewnątrz ciała funkcji. Na koniec musisz forward włączyć lvalue-turned x (ponieważ ma teraz nazwę!) z powrotem do referencji rvalue, jeśli była to pierwsza.

Nie należy jednak przekazywać czegoś więcej niż raz, ponieważ zazwyczaj nie ma to sensu: przekazywanie oznacza to, że potencjalnie przenosisz argument aż do ostatniego wywołującego, a gdy zostanie przeniesiony, zniknie, więc nie możesz użyć go ponownie (w sposób, w jaki prawdopodobnie chciałeś).

 109
Author: Kerrek SB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-13 18:35:59