С++ 0x показывает пример использования std::forward:
template<class T>
void foo(T&& arg) 
{
  bar(std::forward<T>(arg));
}
Когда выгодно использовать std::forward, всегда?
Кроме того, в объявлении параметров требуется использовать &&, действительно ли это во всех случаях? Я думал, что вам нужно передать временные функции функции, если функция была объявлена с помощью && в ней, поэтому можно вызвать foo с любым параметром?
Наконец, если у меня есть вызов функции, например:
template<int val, typename... Params>
void doSomething(Params... args) {
  doSomethingElse<val, Params...>(args...);
}
Должен ли я использовать это вместо:
template<int val, typename... Params>
void doSomething(Params&&... args) {
  doSomethingElse<val, Params...>(std::forward<Params>(args)...);
}
Кроме того, если использовать параметры дважды в функции, то есть пересылать одновременно две функции, целесообразно ли использовать std::forward? Не будет ли std::forward дважды преобразовывать одно и то же в временное, перемещая память и делая ее недействительной для второго использования? Будет ли код в порядке:
template<int val, typename... Params>
void doSomething(Params&&... args) {
  doSomethingElse<val, Params...>(std::forward<Params>(args)...);
  doSomethingWeird<val, Params...>(std::forward<Params>(args)...);
}
Меня немного смущает std::forward, и я с удовольствием воспользуюсь некоторой очисткой.
