std::forward

来自cppreference.com
< cpp‎ | utility

 
 
实用工具库
类型的支持 (basic types, RTTI, type traits)
动态内存管理
错误处理
程序实用工具
可变参数函数
日期和时间
函数对象
initializer_list(C++11)
bitset
hash(C++11)
关系运算符
原文:
Relational operators
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
rel_ops::operator!=
rel_ops::operator>
rel_ops::operator<=
rel_ops::operator>=
双和元组
原文:
Pairs and tuples
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
pair
tuple(C++11)
piecewise_construct_t(C++11)
piecewise_construct(C++11)
掉期,远期和移动
原文:
Swap, forward and move
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
swap
forward(C++11)
move(C++11)
move_if_noexcept(C++11)
declval(C++11)
 
在头文件 <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()通过一个rvaluestd::string,那么T推导出std::string(不std::string&const std::string&,或std::string&&),和std::forward确保一个右值引用传递给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()通过一个non-const左值std::string,那么T推导出std::string&,并std::forward确保一个non-const左值的引用被传递给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 自动翻译生成的。
    您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

目录

[编辑] 注释

尝试发送一个右值作为左值,如表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 specification:  
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
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 另请参阅

(C++11)
获得一个右值引用
原文:
obtains an rvalue reference
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

(函数模板) [edit]
获得一个右值引用的举动构造方法不抛出
原文:
obtains an rvalue reference if the move constructor does not throw
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

(函数模板) [edit]