Когда использовать std :: forward для пересылки аргументов?

C ++ 0x показывает пример использования std::forward :

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

Когда выгодно использовать std::forward , всегда?

Кроме того, требуется использовать && в объявлении параметров, действительно ли это во всех случаях? Я думал, что вам нужно передать временные функции функции, если функция была объявлена ​​с помощью && в ней, поэтому можно вызвать foo с любым параметром?

Наконец, если у меня есть вызов функции, например:

 template void doSomething(Params... args) { doSomethingElse(args...); } 

Должен ли я использовать это вместо этого:

 template void doSomething(Params&&... args) { doSomethingElse(std::forward(args)...); } 

Кроме того, если использовать параметры дважды в функции, то есть пересылка на две функции одновременно, целесообразно ли использовать std::forward ? Не будет std::forward преобразовать одну и ту же вещь в временную дважды, перемещая память и делая ее недействительной для второго использования? Будет ли код в порядке:

 template void doSomething(Params&&... args) { doSomethingElse(std::forward(args)...); doSomethingWeird(std::forward(args)...); } 

Я немного смущен std::forward , и я бы с удовольствием воспользовался некоторыми прояснениями.

Используйте его, как ваш первый пример:

 template  void f(T && x) { g(std::forward(x)); } template  void f(Args && ...args) { g(std::forward(args)...); } 

Это из-за правил сбрасывания ссылок : если T = U& , то T&& = U& , но если T = U&& , то T&& = U&& , поэтому вы всегда получаете правильный тип внутри тела функции. Наконец, вам нужно перевернуть, чтобы включить lvalue- x (потому что теперь он имеет имя!) Обратно в ссылку rvalue, если она была изначально.

Вы не должны пересылать что-то более одного раза, потому что это обычно не имеет смысла: пересылка означает, что вы потенциально перемещаете аргумент до последнего вызывающего абонента, и как только он перемещается, он исчез, поэтому вы не можете его использовать снова (так, как вы, вероятно, хотели).

  • Ограничить параметр шаблона C ++ для подclassа
  • Как определить, существует ли конкретная переменная-член в classе?
  • Сведения о создании шаблона компиляторов GCC и MS
  • Явная специализация в области пространства имен (дубликат)
  • Изменение шаблонов в Xcode
  • Почему Синглтон считается анти-шаблоном?
  • C ++ 11: я могу перейти от нескольких аргументов к кортежу, но могу ли я перейти от кортежа к нескольким аргументам?
  • Расшифровка сообщений об ошибках шаблона C ++
  • Делают ли c ++ шаблоны медленными?
  • В чем преимущество шаблона без логики (например, усы)?
  • какова процедура частичного заказа в выводе шаблона
  • Давайте будем гением компьютера.