Namespaces
Variants
Views
Actions

std::forward

From cppreference.com
< cpp‎ | utility
Revision as of 01:15, 13 February 2013 by Juanchopanza (Talk | contribs)

Template:ddcl list begin <tr class="t-dsc-header">

<td>
Defined in header <utility>
</td>

<td></td> <td></td> <tr class="t-dcl-sep"><td></td><td></td><td></td></tr>

<tr class="t-dcl ">

<td >
template< class T >
T&& forward( typename std::remove_reference<T>::type& t );
</td>

<td > (1) </td> <td > (since C++11) </td> </tr> <tr class="t-dcl-sep"><td></td><td></td><td></td></tr>

<tr class="t-dcl ">

<td >
template< class T >
T&& forward( typename std::remove_reference<T>::type&& t );
</td>

<td > (2) </td> <td > (since C++11) </td> </tr> Template:ddcl list end

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.

template<typename T>
void wrapper(T&& arg) {
  foo(std::forward<T>(arg));
}


  • 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.
  • 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.
  • 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.

Contents

Notes

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.

Parameters

t - the object to be forwarded

Return value

static_cast<T&&>(t)

Exceptions

noexcept specification:  
noexcept
  

Example

This example demonstrates perfect forwarding of the parameter of the function make_unique() to the argument of the constructor of class T

#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
}

Output:

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

Complexity

Constant

See also

(C++11)
obtains an rvalue reference
(function template) [edit]
obtains an rvalue reference if the move constructor does not throw
(function template) [edit]