栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++】右值引用可以绑定左值?---自动类型推断时可能出现的情况

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++】右值引用可以绑定左值?---自动类型推断时可能出现的情况

通常情况下,右值引用不能绑定左值,如果想绑定左值,需要用std::move()将左值转为将亡值。

int main(){
	int a = 10;
	int && b = move(a);//没有move()则:error: cannot bind 'int' lvalue to 'int&&'|
	cout< 

输出10 10;

特殊情况下使用auto或者template发生自动类型推断的时候,&& t可能会成为 普通引用 或 常量引用 或者 右值引用 。

如果传入普通左值a,那么b的类型会被推导成左值引用。
比如:

int main(){
	int a = 10;
	auto && b = a;
	cout< 

同样输出10 10 11 11 ,此时b是普通左值引用。

如果传入常量引用a

int main(){
	const int& a = 10;
	auto && b = a;
	cout< 

输出10 10,且无法更改b,说明了b是常量引用。

如果传入右值引用10

int main(){
	auto && b = 10;
	cout< 

输出10 11,此时b是10的右值引用,且可以修改b的值。

即在发生自动类型推断的时候,&&只是表面,实际上是什么引用,取决于用于引用的对象。

事实上auto
除了一个特例以外与模版推导类型别无二致
特例:auto x = {1}或者auto x = {1, 2}会被推断成std::initializer_list,而template会直接出错

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/767014.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号