C_and_CPP 板


LINE

※ 引述《lovejomi (JOMI)》之铭言: : 最近会看到一些c++17语法 想说来研究一下 : https://en.cppreference.com/w/cpp/language/structured_binding : 网路上介绍的文章许多 但都完全只是"介绍" 我实际上遇到一些怪异的型别推导结果 : 完全无法归纳规则 可能变成 知道可以用 但不敢乱用.... : 也许cppref 有介绍的很完整但我实在是看不太懂他表达的 : 举几个例子 : 1. 这属於网页上的case几?我不知道.... : std::map<int, int> m; : for (auto& [k, v] : m) { : k = 123; : } : k 是const& 变成不能改 ??? why.... : 好那我 : std::map<int, int> m; : for (auto [k, v] : m) { : k = 123; : } : k是const int....哪来的const.... : 2. : int a = 1, b = 2; : const auto& [x, y] = std::tie(a, b); : x = 5566; : 一脸就是const! 但竟然x是 int&.....可以改 why....+2 : 好那我 : auto [z, w] = std::tie(a, b); : z = 123; : 我什麽都不加....乍看就是int : z竟然是int&....我不小心改到了a..... : 这我可能还可以理解 他会去decltype(z) 结果是int& 但实在不好读也很容易误用 最好的语言学习资源是提案, 我们来参考原提案的最新修订版 P0144R2 [P0144R2] Structured bindings https://bit.ly/2ZNT6kJ 看提案可以了解这个语言特性被设计来解决什麽问题, 使用的方法以 及可能会遇到的问题等. 先来讲最简单的案例: 只有用到 auto 来绑 定的情形: auto [x,y,z] = f(); 需要注意的是这里的 auto 用法和非 structured binding 的物件定 义不同, 是用来绑定等号右边的叙述, 如果右边是 std::tuple 则适 用以下规则: auto __a = expression; tuple_element<0, decltype(E)>::type& x = get<0>(__a); tuple_element<1, decltype(E)>::type& y = get<1>(__a); tuple_element<2, decltype(E)>::type& z = get<2>(__a); E 是该叙述的型别, 你要接 std::tie() 的结果之前最好先查一下它 的回传型别: template< class... Types > tuple<Types&...> tie( Types&... args ) noexcept; 原本的叙述经过代换会变成: tuple<int&,int&> __a = std::tie(a, b); tuple_element<0, tuple<int&,int&>>::type& z = get<0>(__a); tuple_element<1, tuple<int&,int&>>::type& w = get<1>(__a); 再查一下 tuple_element 的 member type 作进一步代换: tuple<int&,int&> __a = std::tie(a, b); int& z = get<0>(__a); int& w = get<1>(__a); 最後决定 z/w 型别为 int& 的地方是最外层的 & 而不是 tuple_element 的 member type, 以及刚好可以用 ref to lvalue 来绑定 get 的结果. 以上就是 structured binding 对於 std::tuple 的简单解说. 再 来是此特性的进阶应用: 撰写支援 structured binding 的自订型 . 从 P0144R2 中间你可以看到: tuple_element<#,decltype(E)> get<#>(expression) 叙述里都没有加前缀 std:: 修饰符, 这代表标准允许使用者将此两 个元件定义在自己的命名空间里, 甚至 get 还可以作为 friend member function. 所以当我们想为自己的型别提供某种程度的抽象 化, 又不愿意将资料成员 access level 都标记为 public 时, 就可 以利用这个设计: https://wandbox.org/permlink/uETqTeLuT4zyim2t -- P1389R0: Guidelines for Teaching C++ to Beginners https://bit.ly/2GvDWKb SG20 Education and Recommended Videos for Teaching C++ https://www.cjdb.com.au/sg20-and-videos --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.76.216 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1561489047.A.1E0.html
1F:推 sarafciel: 推 06/26 08:45
※ 编辑: poyenc (61.216.75.43 台湾), 06/26/2019 15:21:02







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP