可能重复:
使用forward的优点
有人可以向我解释一下完美的转发是什么意思吗?
我最近一直在研究C++中的转发引用,下面简要概述了我目前对该概念的理解.
假设我有一个模板函数,foo它将转发引用转换为类型的单个参数T.
template<typename T>
void foo(T&& arg);
Run Code Online (Sandbox Code Playgroud)
如果我用左值调用此函数,那么T将推断为由于参考折叠规则T&使arg参数成为类型.T&T& && -> T&
如果使用未命名的临时函数(例如函数调用的结果)调用此函数,T则将推断为T使arg参数为类型T&&.
foo但是,里面arg是一个命名参数,所以std::forward如果我想将参数传递给其他函数并仍然保持其值类别,我将需要使用.
template<typename T>
void foo(T&& arg)
{
bar(std::forward<T>(arg));
}
Run Code Online (Sandbox Code Playgroud)
据我所知,cv-qualifiers不受此转发的影响.这意味着如果我使用命名的const变量调用foo,那么T将推断为const T&,因此类型arg也将const T&归因于引用折叠规则.对于const rvalues T将被推导为const T,因此arg将是类型const T&&.
这也意味着如果我修改arg内部的值,foo如果我将一个const变量传递给它,我将得到编译时错误.
现在我的问题.假设我正在编写容器类,并希望提供一种将对象插入容器的方法.
template<typename T>
class Container
{
public: …Run Code Online (Sandbox Code Playgroud)