C ++ 0x muestra un ejemplo de uso std::forward
:
template<class T>
void foo(T&& arg)
{
bar(std::forward<T>(arg));
}
¿Cuándo es ventajoso usar std::forward
, siempre?
Además, requiere su uso &&
en la declaración de parámetros, ¿es válido en todos los casos? Pensé que tenía que pasar temporarios a una función si la función se declaraba con &&
ella, por lo que ¿se puede llamar a foo con algún parámetro?
Por último, si tengo una llamada de función como esta:
template<int val, typename... Params>
void doSomething(Params... args) {
doSomethingElse<val, Params...>(args...);
}
Debería usar esto en su lugar:
template<int val, typename... Params>
void doSomething(Params&&... args) {
doSomethingElse<val, Params...>(std::forward<Params>(args)...);
}
Además, si usa los parámetros dos veces en la función, es decir, reenvío a dos funciones al mismo tiempo, ¿es conveniente usarlo std::forward
? ¿No std::forward
convertirá lo mismo en temporal dos veces, moviendo la memoria y haciendo que no sea válida para un segundo uso? ¿Estaría bien el siguiente código?
template<int val, typename... Params>
void doSomething(Params&&... args) {
doSomethingElse<val, Params...>(std::forward<Params>(args)...);
doSomethingWeird<val, Params...>(std::forward<Params>(args)...);
}
Estoy un poco confundido std::forward
y con mucho gusto usaría algo de limpieza.
Args...&& args
?