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

std::forward

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

Defined in header <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.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
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.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если вызов 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.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Если вызов 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.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

[править] Заметки

Попытка направить 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.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

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

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

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

static_cast<T&&>(t)

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

спецификация noexcept:  
noexcept
  

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

Этот пример демонстрирует идеальную передачу (perfect forwarding) аргумента функции make_unique1<T> в конструктор класса T. Также демонстрируется использование идеальной передачи параметров в вариативный шаблон.

#include <iostream>
#include <memory>
#include <utility>
#include <array>
 
struct A {
    A(int&& n) { std::cout << "rvalue overload, n=" << n << "\n"; }
    A(int& n)  { std::cout << "lvalue overload, n=" << n << "\n"; }
};
 
class B {
public:
    template<class T1, class T2, class T3>
    B(T1&& t1, T2&& t2, T3&& t3) :
        a1_{std::forward<T1>(t1)},
        a2_{std::forward<T2>(t2)},
        a3_{std::forward<T3>(t3)}
    {
    }
 
private:
    A a1_, a2_, a3_;
};
 
template<class T, class U>
std::unique_ptr<T> make_unique1(U&& u)
{
    return std::unique_ptr<T>(new T(std::forward<U>(u)));
}
 
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()
{   
    auto p1 = make_unique1<A>(2); // rvalue
    int i = 1;
    auto p2 = make_unique1<A>(i); // lvalue
 
    std::cout << "B\n";
    auto t = make_unique<B>(2, i, 3);
}

Вывод:

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

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

Константная.

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

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

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

(шаблон функции) [править]