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

深圳市专业网站建设网站建设中广告图片尺寸

深圳市专业网站建设,网站建设中广告图片尺寸,东莞营销型网站建站,企业网站域名空间左值与右值 序言概念左值和右值的划分理解右值引用常量左值引用与右值引用 移动语义引用折叠完美转发 参考资料 序言 虽然平常都算是了解左值#xff0c;右值的用法#xff0c;但是好记性不如烂笔头#xff0c;记下来供大家评鉴#xff0c;有错改错#xff0c;有善赞善右值的用法但是好记性不如烂笔头记下来供大家评鉴有错改错有善赞善也是对于自己知识的一次梳理。 为什么要分清楚左值和右值这是因为在理清楚左值和右值合适为其设置适合的用法能够有效减少资源开销。 但是对于一些POD类型的资源那就无所谓左值右值了因为拷贝即移动移动即拷贝。 接下来我以左值和右值的讨论依次简单讲解左值和右值的概念右值引用移动语义引用折叠完美转发。明确左值和右值理清楚后可以使用的主要用法。 注1. 开始看下面之前需要注意的是这些除了专业名词之外基本都是基于个人理解去通俗诠释概括的想直接看专业且全面的概念就找末尾的参考资料看。 2.以下有比较多的专业词汇初学者建议慢慢看和查询拓展。 概念 左值和右值的划分理解 左值(lvalue)和右值(rvalue)是C11之前的概念但是也通用到后面。 C11及之后划分为 泛左值(glvalue)、将亡值(xvalue也称亡值消亡值)和纯右值(prvalue) 左值(C11之前)赋值运算“”左边的变量 右值(C11之前)赋值运算“”右边的表达式左值(C11及之后)非将亡值的泛左值有地址的变量 右值(C11及之后)纯右值或者将亡值生命周期在表达式里。int a 15 29; std::cout a; // 0xeffc40 std::cout (15 29); //error: Cannot take the address of an rvalue of type int std::cout xzz; //0xa16444以简单的例子这个a承载类型的值自身是有地址的可以取地址值这个就是左值。 15 29这个表达式的结果是纯右值不能取地址值。 注顺带一提许多普通常量都是纯右值但是字符串不是是左值因为普通常量都是可以用普通的机器码就可以表示其值但是字符串无法合适表示所以将其放置在常量区分配内存专门存放。 想必想了解左值和右值的人估计都看过这个图 或者是类似的基本都是说将亡值是泛左值和右值的交集。 但是这其实是容易让人摸不着头脑的但是本质角度上又是能说得过去的。 1. 将亡值被包含在右值这边是因为其的 生命周期和右值是一样 的都在一个表达式里面。 2. 将亡值被包含在泛左值这边是因为其是 匿名对象有地址和左值是一样 的。而上述也引申出了怎么判断将亡值。 将亡值生命周期在一个表达式里且是匿名对象有地址。C17的临时量实质化也是将亡值。 . 右值引用 右值引用T 顾名思义是引用右值的无论是纯右值还是将亡值。 右值引用是C11引入的值得注意的是右值引用的变量是个左值。 因为其是完全符合左值定义的众所周知引用本质上是一种特殊的指针可以这么认为指针指向的值是右值但是指针本身并不是右值。 所以你如果想右值引用 右值引用的变量 这样是不行的 int a 5; // 编译正常可以随意右值引用纯右值 int b a; // 编译错误右值引用的目的是延长将亡值的生命周期减少资源开销或者是为了移动语义服务使其进行资源转移。 struct AA {}; AA createAA() {return AA(); } int main() {AA a createAA(); }右值引用AA a接纳了本来表达式结束就要释放掉资源的匿名对象AA() 并可以任意更改匿名对象的资源。 常量左值引用与右值引用 在C11之前负责右值引用(T )功能的是常量左值引用(const T )只不过和右值引用相比常量左值引用无法修改其值且只能用于拷贝语义不能用以移动语义。 可以看出来常量左值引用和右值引用做的事情是一样的。 顺带一提不建议用右值引用去引用POD类型的纯右值因为纯右值要想被右值引用就得先压栈地址才能给其引用。 从开销上看不如直接普通的赋值。 就算单纯只看条数右值引用用了3条普通赋值才用了1条开销一目了然。 . 移动语义 移动语义(Move Semantics)是 C11 引入的一项重要特性它使得实例对象的资源不通过拷贝的方式进行转移除了POD类型。 移动语义具体化其实就是移动构造函数。 struct Resource { ... }class XZZ { public:...构造或者其他的实例化资源...移动构造函数XZZ(XZZ value) {this.m_resource value.m_resource;value.m_resource nullptr;}/// 移动赋值函数XZZ operator (XZZ value) {this.m_resource value.m_resource;value.m_resource nullptr;}... private:Resource *m_resource nullptr; }上面是个简单的例子主要是为了理解移动是怎么来移动资源的。 如果m_resource不是指针也可以通过使用std::move强行将value.m_resource转成右值来触发this.m_resource的移动构造使得两个m_resource的资源进行移动达到同样的效果。 _EXPORT_STD template class _Ty _NODISCARD _MSVC_INTRINSIC constexpr remove_reference_t_Ty move(_Ty _Arg) noexcept {return static_castremove_reference_t_Ty(_Arg); }std::move的效果便是强制将传进来的参数转成右值一般可以将已经右值引用的变量或者将要释放的类型转成右值(将亡值)实现移动语义的功能。 再次提醒如果资源是POD类型的那用移动语义其实没有意义因为移动就是拷贝拷贝就是移动。 另外移动构造什么情况下可以编辑器会提供默认移动构造什么情况下会弃置默认移动构造只能自己写的这些内容不在本节重点感兴趣可自行查看。 . 引用折叠 说回右值引用的类型左值引用的右值引用或者右值引用的左值引用那到底是左值引用还是右值引用呢 C11中引入引用折叠规则reference collapsing通过模板或 typedef 中的类型操作可以构成引用的引用此时适用引用折叠规则右值引用的右值引用折叠成右值引用所有其他组合均折叠成左值引用 废话不多说 简单通俗来说只有右值引用本身和叠加两次的右值引用类型才是右值引用类型否则含至少一个引用的都是左值引用。 不能直接声明一个超过两个的类型 int a 10; int b a; // error: b declared as a reference to a reference但是如果通过using或者typedef间接声明就可以了 typedef int intR; using intRe int;int a 10; intR b a; // 等同于 int b a intRe c a; // 等同于 int c a有了引用折叠就可以好好使用类型擦除完美转发参数类型给别的函数或者类。 . 完美转发 所谓完美转发(prefect forwarding)是指在函数模板中完全依照模板的参数的类型将参数传递给函数模板中调用的另外一个函数。 ——《C 11新特性解析与应用》 完美转发关键点在于 函数模板函数模板参数类型是 类型要接收函数模板参数的函数/类实参用std::forward包装一下 template typename _Ty, typename... _Type _Ty *createClass(_Type... args) {return new _Ty(std::forward(args)...); }这是个没什么实质意义的模板函数仅是为了举例。 为什么要用std::forward 是因为右值引用args本身是左值传进来本身如果是个右值的话结果给到接收函数是个左值那就不是“完美”转发了。 _EXPORT_STD template class _Ty _NODISCARD _MSVC_INTRINSIC constexpr _Ty forward(remove_reference_t_Ty _Arg) noexcept {return static_cast_Ty(_Arg); }_EXPORT_STD template class _Ty _NODISCARD _MSVC_INTRINSIC constexpr _Ty forward(remove_reference_t_Ty _Arg) noexcept {static_assert(!is_lvalue_reference_v_Ty, bad forward call);return static_cast_Ty(_Arg); }所以需要转成右值的类型而如果是左值的话因为函数重载和引用折叠的缘故即使通过std::forward也是转成左值类型。 参考资料 《C 11新特性解析与应用》 《C/C 参考文档》
http://www.hkea.cn/news/14412364/

相关文章:

  • 昆山住房和城乡建设部网站平面设计工作主要内容
  • 佛山网站设计专业浙江网站建设哪里有
  • 潍坊网站建设 诸城wordpress cdn 阿里云
  • 江北网站建设价格友情链接外链
  • 怎样在我的世界做汽车视频网站西安市未央区建设局官方网站
  • 宁波网站推广优化外包中国国内最新新闻
  • 东莞企业网站价格龙口市最新公告
  • 手机免费建站系统代码型网页制作软件
  • 刘强东自己做网站阿里巴巴官网下载app
  • 平台网站建设协议书坑梓网站建设包括哪些
  • 福州软件网站开发培训班那些网站使用vue做的
  • 博客网站seo站长之家seo综合查询
  • 怎么用手机做刷会员网站温州seo结算
  • 京东购物网站怎么做123邢台招聘信息网
  • 聚美优品返利网站怎么做网站的彩色标签怎么做的
  • 做界面网站用什么语言网站空间合同
  • 浙江网站建设商城价格三合一网站和传统网站
  • 规划和布局营销型网站的四大重点vs做网站怎么添加子页
  • 网页浏览器哪个好用淮安做网站seo
  • 有哪些网站是用php做的网络售后服务
  • 深圳网站建设素材网站iis网站属性
  • 济南建站公司价格wordpress表白模板下载
  • 网站排名下降原因西宁市网站设计企业
  • 安庆哪里做网站怎么做网站推广的论文
  • 全球搜索引擎网站图片编辑器免费
  • 免费送的广告怎么在网站上做什么是网络设计冗余设计
  • 上海网站seo设计公司怎么做网站
  • 太原网站公司网站开发快递文件
  • 怎么样才能建立网站平台wordpress um插件
  • 家教网站域名怎么做设计网站大全湖南岚鸿网站大全