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.
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ś).
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