Пространства имён
Варианты
Действия

std::forward

Материал из cppreference.com
< cpp‎ | utility

Определено в заголовочном файле <utility>
template< class T >
T&& forward( typename std::remove_reference<T>::type& t );
(1) (начиная с C++11)
template< class T >
T&& forward( typename std::remove_reference<T>::type&& t );
(2) (начиная с C++11)
При использовании в соответствии со следующим рецептом в шаблон функции, передает аргумента другой функции так, как он был принят в вызывающую функцию.
Оригинал:
When used according to the following recipe in a function template, forwards the argument to another function exactly as it was passed to the calling function.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
template<typename T>
wrapper(T&& arg) {
  foo(std::forward<T>(arg));
}


  • Если вызов wrapper() проходит RValue std::string, то T выводится на std::string (не std::string&, const std::string&, или std::string&&), и std::forward гарантирует, что RValue ссылка передается foo.
    Оригинал:
    If a call to wrapper() passes an rvalue std::string, then T is deduced to std::string (not std::string&, const std::string&, or std::string&&), and std::forward ensures that an rvalue reference is passed to foo.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Если вызов wrapper() проходит константный именующее std::string, то T выводится на const std::string&, и std::forward гарантирует, что константный именующее ссылка передается foo.
    Оригинал:
    If a call to wrapper() passes a const lvalue std::string, then T is deduced to const std::string&, and std::forward ensures that a const lvalue reference is passed to foo.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
  • Если вызов wrapper() проходит неконстантные именующее std::string, то T выводится на std::string&, и std::forward гарантирует, что неконстантные именующее ссылка передается foo.
    Оригинал:
    If a call to wrapper() passes a non-const lvalue std::string, then T is deduced to std::string&, and std::forward ensures that a non-const lvalue reference is passed to foo.
    Текст был переведён автоматически через Google Translate.
    Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

Содержание

[править] Notes

Попытка направить RValue как именующее, например, путем создания экземпляра формы 2) с именующее ссылочного типа T, является ошибкой времени компиляции.
Оригинал:
Attempting to forward an rvalue as an lvalue, such as by instantiating the form 2) with lvalue reference type T, is a compile-time error.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Параметры

t -
объект, который будет направлен
Оригинал:
the object to be forwarded
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Возвращаемое значение

static_cast<T&&>(t)

[править] Исключения

noexcept-спецификация:  
noexcept
  (начиная с C++11)

[править] Пример

Этот пример демонстрирует идеальный пересылка параметр функции make_unique () в качестве аргумента конструктору класса T
Оригинал:
This example demonstrates perfect forwarding of the parameter of the function make_unique() to the argument of the constructor of class T
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

#include <iostream>
#include <memory>
#include <utility>
 
struct A {
    A(int&& n) { std::cout << "rvalue overload, n=" << n << "\n"; }
    A(int& n)  { std::cout << "lvalue overload, n=" << n << "\n"; }
};
 
template<class T, class U>
std::unique_ptr<T> make_unique(U&& u)
{
    return std::unique_ptr<T>(new T(std::forward<U>(u)));
}
 
int main()
{
    std::unique_ptr<A> p1 = make_unique<A>(2); // rvalue
    int i = 1;
    std::unique_ptr<A> p2 = make_unique<A>(i); // lvalue
}

Вывод:

rvalue overload, n=2
lvalue overload, n=1

[править] Сложность

Constant
Оригинал:
Constant
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] См. также

(C++11)
получает RValue ссылки
Оригинал:
obtains an rvalue reference
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]
получает RValue ссылку, если движение конструктор не бросают
Оригинал:
obtains an rvalue reference if the move constructor does not throw
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]