程序输出:
143
153
f2的功能就像位域的引用一样,既能写回原值,又不会超出位域的范围。
还有一些语法细节,比如get的名字查找、std::tuple_size没有value、explicit拷贝构造函数等,除非是深挖语法的languagelawyer,在实际开发中不必纠结(上面这一堆已经可以算languagelawyer了吧)。
局限
以上代码示例应该已经囊括了所有类型的结构化绑定应用,你能想象到的其他语法都是错的,包括但不限于:
用std::initializer_list初始化;
因为std::initializer_list的长度是动态的,但结构化绑定的标识符数量是静态的。
用列表初始化——auto[x,y,z]={1,"xyzzy"s,3.14159};;
这相当于声明了三个变量,但结构化绑定的意图在于绑定而非声明。
不声明而直接绑定——[iter,success]=mymap.insert(value);;
这相当于用std::tie,所以请继续用std::tie。另外,由[开始可能与attributes混淆,给编译器和编译器设计者带来压力。
指明结构化绑定的修饰符——auto[&x,consty,const&z]=f();;
同样是脱离了结构化绑定的意图。如果需要这样的功能,或者一个个定义变量,或者手动写上三要素。
指明结构化绑定的类型——SomeClass[x,y]=f();或auto[x,std::stringy]=f();;
第一种可用auto[x,y]=SomeClass{f()};代替;第二种同上一条。
显式忽略一个结构化绑定——auto[x,std::ignore,z]=f();;
消除编译器警告是一个理由,但是auto[x,y,z]=f();(void)y;亦可。这还涉及一些语言问题,请移步P0144R23.8节。
标识符嵌套——std::tuple,T4>f();auto[w,[x,y],z]=f();;
多写一行吧。[同样可能与attributes混淆。
以上语法都没有纳入C++20标准,不过可能在将来成为C++语法的扩展。
延伸
C++17的新特性不是孤立的,与结构化绑定相关的有:
类模板参数推导(classtemplateargumentdeduction,CTAD),由构造函数参数推导类模板参数;
拷贝省略(copyelision),保证NRV(namedreturnvalue)优化;
constexprif,简化泛型代码,消除部分SFINAE;
带初始化的条件分支语句:语法糖,使代码更加优雅。
到此这篇关于C++17结构化绑定的实现的文章就介绍到这了,更多相关C++17结构化绑定内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。