当前位置: 首页 > news >正文

网站开发自学下载小程序

网站开发自学,下载小程序,wordpress主题时尚科技,wordpress模板错位我们知道,C中有左值引用和右值引用,首先我们要知道什么是左值什么是右值。 左值:表达式结束后依然存在的持久对象。左值可以出现在赋值语句的左边或右边。例如,变量和函数返回的引用都是左值。左值通常有持久的地址,可…

        我们知道,C++中有左值引用和右值引用,首先我们要知道什么是左值什么是右值。

        左值:表达式结束后依然存在的持久对象。左值可以出现在赋值语句的左边或右边。例如,变量和函数返回的引用都是左值。左值通常有持久的地址,可以被取地址操作符 & 获取地址。

        右值:通常是临时的,不能有多个引用,它们不指向持久存储。右值可以出现在赋值语句的右边,但不能出现在左边。字面量(如 42 或 "hello")和将亡值(函数返回的非引用类型)都是右值。右值通常用于描述临时对象或字面值,它们在使用后很快就会被销毁。

        那么,在将左值引用和右值引用传入函数的时候,我们有时候需要保存它的左值属性或者右值属性,这时就需要分别写出左值引用和右值引用函数重载。我们也可能需要将不同类型的参数传入函数,这时候就需要用到函数模板。

函数重载如下:

void func(int &n){cout << "左值=" << n << endl;
}void func(int &&m){cout << "右值=" << m << endl;
}

函数模板如下:

//第一种函数模板
template<class T>
void func(T &n){cout << "左值=" << n << endl;
}
template<class T>
void func(T &&m){cout << "右值=" << m << endl;
}//第二种函数模板
void func(int &n){cout << "左值=" << n << endl;
}
void func(int &&m){cout << "右值=" << m << endl;
}
void func(double &n){cout << "左值double=" << n << endl;
}
void func(double &&m){cout << "右值double=" << m << endl;
}template<class T>
void revoke(T &&t){func(t);
}

        第一种能正确输出左右值,但是,它并不能对不同类型的参数调用不同操作(不符合多态),假如你想要int类型的参数打印int,想要double类型的参数打印double,第一种函数无法实现。

        第二种不能正确输出左右值,全部都走到左值,因为t是一个左值变量,只会被转发到左值函数中。

        综上,只有用完美转发才能实现既识别左右值,又能对不同类型的参数调用不同操作。

通过forward<>()实现完美转发

void func(int &n){cout << "左值int=" << n << endl;
}
void func(int &&m){cout << "右值int=" << m << endl;
}
void func(double &n){cout << "左值double=" << n << endl;
}
void func(double &&m){cout << "右值double=" << m << endl;
}template<class T>
void revoke(T &&t){func(forward<T>(t));
}int main(){int i = 10;int &n = i;int &&m = 100;m = 10;//只能识别左右值,不能根据参数类型选择不同操作// func(n);// func(static_cast<int&&>(m));//正确推导revoke(static_cast<int&>(n));revoke(static_cast<int&&>(m));revoke(n);revoke(move(m));    //移动语义,将m的内容移动给一个临时变量,此时传递的是将亡值,会被识别成右值。move之后m的资源被转移,不应该再次使用mdouble d = 1.1;double &dn = d;double &&dm = 10.10;revoke(static_cast<double&>(dn));revoke(static_cast<double&&>(dm));// //err -- 全部是左值// revoke(n);// revoke(m);// //err -- 全部是右值// revoke(static_cast<int>(n));// revoke(static_cast<int>(m));return 0;
}

输出如下:

走到这里,又引出三个问题。1.T&&是什么        2.forward原理        3.为什么要强转

1.T&&是什么:

        有个东西叫引用折叠

                引用折叠的规则:

                        如果两个引用中至少有一个是左值引用(&),那么结果是左值引用(&

                        如果两个引用都是右值引用(&&),那么结果是右值引用(&&

                比如我们int & &&,那么它会引用折叠变成int & 

                               int && &&,会变成int &&

        引用折叠和模板很像,模板识别参数类型,引用折叠识别引用类型。比如我们template<class T>,那么输入int就会识别成int,输入double就会识别成double。在引用折叠下,输入什么值引用就会识别成什么值引用。

2.forward原理

        forward用于保持原参数的类型,比如我是int&就保持int&,在第二种函数模板中,我们已经说过了,如果不保持原参数的类型,那么t就是一个左值变量,会全部走到左值

3.为什么要强转

        查看完美转发的代码,可以发现有两个错误示例

    //err -- 全部是左值revoke(n);revoke(m);//err -- 全部是右值revoke(static_cast<int>(n));revoke(static_cast<int>(m));

        第一个 -- 在函数调用时,如果你直接传递一个具名变量(无论它是通过左值引用还是右值引用声明的),该变量作为参数传递给函数时总是作为左值传递的。如果我们不强转,那么会被识别左值,这里的强转实际上是告诉函数,我想要传递的类型是什么

        第二个 -- 当一个A类型变量强转为B类型时,实际上是创建了一个B类型的匿名对象来接收一个A类型的变量的值,而匿名对象是右值(将亡值),并且它不具名,所以会被识别成右值(只有具名变量才会默认作为左值传递)

        

http://www.yayakq.cn/news/74612/

相关文章:

  • 小网站模板买源码做网站
  • flash网站怎么制作淘宝代运营公司哪家好
  • 安阳网站优化公司推荐国内几个做外贸的网站
  • 那些视频网站能用来直接做href百度推广会帮你做网站不
  • 钢管网站模板俄罗斯电商平台有哪些
  • 有没有做软件的网站践行新使命忠诚保大庆网站建设
  • 如何做服装企业商城网站小程序注册需要费用吗
  • seo网站推广建站服务商在线网址免费的
  • 设计网站公司湖南岚鸿公司下列哪一项不属于电子商务网站建设
  • 安顺建设工程造价管理网站app嵌入手机网站
  • 公司网站设计与实现自媒体营销方式有哪些
  • 石狮网站建设报价苏州seo怎么做
  • 广州网站建设公司哪家服务好幕墙装饰工程网站模板
  • 梧州网站建设厂家珠海公司制作网站
  • 北京网站建设工作室如何网推
  • 便宜网站建设多少钱网站开发与管理内容
  • 新西兰网站开发专业域名对网站的好处
  • 网站建设一条龙源码h5网站建设模板下载
  • 企业建网站的费用建筑设计网站issuu
  • 沧州网站建设制作设计优化网站建设需要每年交钱吗
  • 青岛网站建设运营推广苏州相城网站建设
  • 达州达县网站建设深圳百度网站优化
  • 做投票网站教程建设工程人员锁定网站
  • 安微省建设厅田网站大连装修公司排名榜
  • 广州网站定制开发方案企业网站建设实训总结
  • 上海建设工程安全质量监督总站网站设计作品展示网站
  • 顶尖的网站建设长沙找工作哪个网站好
  • 自适应式网站模板网站视频接口 怎么做
  • 当地建设厅网站中国最著名的40个建筑
  • 商务网站建设体会长沙网站制作费用