C ++ 0x mostra un esempio di utilizzo std::forward
:
template<class T>
void foo(T&& arg)
{
bar(std::forward<T>(arg));
}
Quando è vantaggioso da usare std::forward
, sempre?
Inoltre, deve essere utilizzato &&
nella dichiarazione dei parametri, è valido in tutti i casi? Pensavo che dovessi passare dei provvisori a una funzione se la funzione è stata dichiarata con &&
essa, quindi puoi chiamare con qualsiasi parametro?
Infine, se ho una chiamata di funzione come questa:
template<int val, typename... Params>
void doSomething(Params... args) {
doSomethingElse<val, Params...>(args...);
}
Dovrei usare questo invece:
template<int val, typename... Params>
void doSomething(Params&&... args) {
doSomethingElse<val, Params...>(std::forward<Params>(args)...);
}
Inoltre, se si utilizzano due volte i parametri nella funzione, ovvero l'inoltro a due funzioni contemporaneamente, è consigliabile utilizzarlo std::forward
? Non std::forward
convertirai la stessa cosa in temporanea due volte, spostando la memoria e rendendola non valida per un secondo utilizzo? Il seguente codice sarebbe ok:
template<int val, typename... Params>
void doSomething(Params&&... args) {
doSomethingElse<val, Params...>(std::forward<Params>(args)...);
doSomethingWeird<val, Params...>(std::forward<Params>(args)...);
}
Sono un po 'confuso std::forward
e vorrei usare volentieri qualche chiarimento.
Args...&& args
?