c++ - 左值和右值作为函数参数
问题描述
我试图理解 C++ 中的左值和右值。
所以我将它们用作传递给函数的参数。在第一种情况下,我有两个函数,第一个引用了一个 const int,在这种情况下,感谢“const”(参见链接),我可以将 Lvalue 和 Rvalue 都传递给第一个函数,我不会有任何问题. 相反,在第二个函数中,我必须传递一个 Rvlaue,否则我会得到描述的错误。
void f1(const int& n){cout<<"[Lvalue]"<<endl;}
void f2(int&& n){cout<<"[Rvalue]"<<endl;}
int main()
{
const int n = 10;
f1(n);
f2(n); //error: cannot bind rvalue reference of type ‘int&&’ to lvalue of type ‘const int’
}
好的!
为什么如果第二个函数成为函数模板,如下例所示,我也可以传递一个左值。
void f1(const int& n){cout<<"[Lvalue]"<<endl;}
template<class T>
void f2(T&& n){cout<<"[Rvalue]"<<endl;}
int main()
{
const int n = 10;
f1(n);
f2(n); //ok
}
解决方案
重要的是,它T
被推断为参考。那么,如果T
是const int&
,那么T&&
ie是什么const int& &&
?参考折叠规则说它是const int&
.
因此,当T
inT&&
被推导时,这&&
并不表示右值引用,而是一个类型被推导的引用,并且可能是右值或左值引用,具体取决于推导的结果。据说是转发参考。
推荐阅读
- r - Accuracy() 和“xx - ff[1:n] 中的错误:二元运算符的非数字参数”
- security - 使用 PKCS#11 和智能卡签署任何文件
- react-native - 创建通用复选框组件
- python - 如何在python中获取填充缺失值的排序值列表?
- mongodb - mongoexport 在 Windows 的命令行提示符中使用 --query
- sql - 如何返回来自内部数组的两个或多个列值?
- javascript - 我在 GET 请求后看到了这个承诺代码:.then(resp => resp.body))
- c# - Entity Framework Core 批量更新底层集合
- go - 如何将文本列的值指定为字符串联合?
- audio - torchaudio 加载后的音频收听