Rvalue转发引用

Dea*_*ean 11 c++ c++11

我正在阅读参考折叠规则,我有一个问题:为什么我将rvalue A传递给

template<typename T>
void foo(T&&);
Run Code Online (Sandbox Code Playgroud)

T推断为A?

例如,如果我传递std::string()给函数T被推断为std::string,为什么不std::string&&呢?这对我来说更有意义,推断出T类型本身背后的理由是什么?

Bar*_*rry 11

这仅仅与我们通常从模板类型推导出现的预期相符:

template <class T> void vfoo(T );
template <class T> void lfoo(T& );
template <class T> void cfoo(T const& );
template <class T> void ffoo(T&& );

std::string x;
vfoo(x);            // deduce T = std::string
lfoo(x);            // deduce T = std::string
cfoo(x);            // deduce T = std::string
ffoo(x);            // deduce T = std::string& !
ffoo(std::move(x)); // deduce T = std::string
Run Code Online (Sandbox Code Playgroud)

原始论文中强调我的:

当使用与右值引用匹配的左值参数推导出函数模板类型时,该类型被推导为左值引用类型.当扣除给出一个rvalue参数时,类型推导就像其他类型一样.

这是一个特殊的左值扣除案例,这就是为什么它在类型扣除规则中得到一个额外的句子.右值的情况是典型的-它线与在推导类型粘贴的简单思维模型,看看有什么功能,你结束了.T&&用一个叫std::string?取得T = std::string这样的说法读取std::string&&.校验.