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 类型。如果有人能解释为什么模板的存在会改变行为,我将不胜感激。
正如您正确想象的那样,关键是它是一个模板并且正在推导参数类型。当您使用左值调用时,当参数是右值引用时,参数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)
虽然模板采用右值引用,但如果类型是左值引用,则参数本身将成为左值引用。
| 归档时间: |
|
| 查看次数: |
262 次 |
| 最近记录: |