将左值传递给RValue的参数

时间:2014-05-11 22:35:18

标签: c++ templates rvalue-reference

我想知道这是怎么回事?

template<typename T>
void Test(T&& arg)
{
    arg = 14;
}


int a = 23;
Test(a);

我的问题是函数Test需要一个Rvalue类型的参数,但它似乎也接受lvalue类型的参数。这是为什么 ?那是因为模板的存在吗?因为如果我做这样的事情

void AnotherTest(int&& arg)
{
    arg = 14;
}

然后该函数要求参数为Rvalue类型。 如果有人能够解释为什么存在模板会改变行为,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

正如您所想象的那样,密钥是模板,参数类型是推导。当您使用左值调用Test时,当参数为右值参考时,参数类型推导的规则将推断类型T左值 - 参考,因此专业化变为:

template <>
void Test<int&>(int & && arg)

此时参考折叠规则启动,参数类型变为:

template <>
void Test<int&>(int & arg)

虽然模板采用 rvalue-reference ,但如果类型是 lvalue-reference ,则参数将成为 lvalue-reference 本身。