std::forward
来自cppreference.com
该页由英文版wiki使用Google Translate机器翻译而来。
该翻译可能存在错误或用词不当。鼠标停留在文本上可以看到原版本。你可以帮助我们修正错误或改进翻译。参见说明请点击这里. |
在头文件 <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.
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 towrapper()
passes an rvaluestd::string
, thenT
is deduced tostd::string
(notstd::string&
,const std::string&
, orstd::string&&
), andstd::forward
ensures that an rvalue reference is passed tofoo
. - 如果调用
wrapper()
通过一个常量左值std::string
,然后T
推导出const std::string&
,并std::forward
确保一个常量左值的引用被传递给foo
.原文:If a call towrapper()
passes a const lvaluestd::string
, thenT
is deduced toconst std::string&
, andstd::forward
ensures that a const lvalue reference is passed tofoo
. - 如果调用
wrapper()
通过一个non-const左值std::string
,那么T
推导出std::string&
,并std::forward
确保一个non-const左值的引用被传递给foo
.原文:If a call towrapper()
passes a non-const lvaluestd::string
, thenT
is deduced tostd::string&
, andstd::forward
ensures that a non-const lvalue reference is passed tofoo
.
目录 |
[编辑] 注释
尝试发送一个右值作为左值,如表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.
[编辑] 参数
t | - | 该对象被转发
|
[编辑] 返回值
static_cast<T&&>(t)
[编辑] 例外
[编辑] 示例
这个例子演示了完美的参数的功能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
#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
[编辑] 复杂度
常数
[编辑] 另请参阅
(C++11) |
获得一个右值引用 (函数模板) |
(C++11) |
获得一个右值引用的举动构造方法不抛出 原文: obtains an rvalue reference if the move constructor does not throw (函数模板) |