将左值传递给 RValue 的参数

Raj*_*war 5 c++ templates rvalue-reference

我想知道这怎么可能?

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


int a = 23;
Test(a);
Run Code Online (Sandbox Code Playgroud)

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

void AnotherTest(int&& arg)
{
    arg = 14;
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*eas 6

正如您正确想象的那样,关键是它是一个模板并且正在推导参数类型。当您使用左值调用时,当参数是右值引用时,参数Test类型推导的规则会将类型推导为左值引用,因此特化变为:T

template <>
void Test<int&>(int & && arg)
Run Code Online (Sandbox Code Playgroud)

此时,引用折叠规则生效,参数的类型变为:

template <>
void Test<int&>(int & arg)
Run Code Online (Sandbox Code Playgroud)

虽然模板采用右值引用,但如果类型是左值引用,则参数本身将成为左值引用