我想知道这是怎么回事?
template<typename T>
void Test(T&& arg)
{
arg = 14;
}
int a = 23;
Test(a);
我的问题是函数Test需要一个Rvalue类型的参数,但它似乎也接受lvalue类型的参数。这是为什么 ?那是因为模板的存在吗?因为如果我做这样的事情
void AnotherTest(int&& arg)
{
arg = 14;
}
然后该函数要求参数为Rvalue类型。 如果有人能够解释为什么存在模板会改变行为,我将不胜感激。
答案 0 :(得分:2)
正如您所想象的那样,密钥是和模板,参数类型是推导。当您使用左值调用Test
时,当参数为右值参考时,参数类型推导的规则将推断类型T
为左值 - 参考,因此专业化变为:
template <>
void Test<int&>(int & && arg)
此时参考折叠规则启动,参数类型变为:
template <>
void Test<int&>(int & arg)
虽然模板采用 rvalue-reference ,但如果类型是 lvalue-reference ,则参数将成为 lvalue-reference 本身。