C_and_CPP 板


LINE

平常真的很少用union 所以当要用的时候还是查了一下 https://en.cppreference.com/w/cpp/language/union S s = {0x12345678}; // initializes the first member, s.n is now the active member // at this point, reading from s.s or s.c is undefined behavior 诶, 这不就是常看到union的标准用法吗? 於是我再找找 http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Ru-pun 恩....真的是undefined behavior.....完全颠覆我之前对union的认知 原来看到这种union { struct{} , array;} 全部都是UB... 想问一下 1. 即使他是 书本上的UB 但是不是可以说 所有已知compiler实作上都让他效果一致 也就是常用的那套手段也没什麽问题, 真的这样写 也不用太苛责? 2. 如果真的不想写出UB 的程式码, 是不是只能用reinterpret_cast 例如 union Endian{ int a; char b; }; 改用 int a = 1; char b = *(reinterpret_cast<char*>(&a)); 对於reinterpret_cast每当用 都很怕是UB, 有没有什麽通则可以快速确认是否转型是UB呢? 以上 (今天才知道union 这样写是UB, 实在很震惊) --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 39.12.193.155 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1592238947.A.863.html ※ 编辑: lovejomi (39.12.193.155 台湾), 06/16/2020 01:00:08
1F:→ loveme00835: 你的认知应该是从 C 语言来的, 所谓的 active member 06/16 02:09
2F:→ loveme00835: 就是已经建构好的物件, 如果你要改用另外一个物件就 06/16 02:09
3F:→ loveme00835: 必须要先解构当前的 active member 再去建构另一个, 06/16 02:09
4F:→ loveme00835: 在 C++ 里所有物件都要经过建构才能用, 只有将指标转 06/16 02:09
5F:→ loveme00835: 型无视这个规则的都是 UB 06/16 02:09
6F:→ loveme00835: 对於 non-class object 也是同理, 建构子/解构子一整 06/16 02:12
7F:→ loveme00835: 套流程缺一不可 06/16 02:12
8F:→ loveme00835: 如果懒得自己处理就改用 std::variant 吧 06/16 07:34
9F:→ lovejomi: 可是primitive type要怎麽建构解构(syntax)? 06/16 09:49
10F:→ lovejomi: 如果要这样 那之前在C work的union写法 在C++是不是无法 06/16 09:50
11F:→ lovejomi: 使用, 如我举例的Endian 例子...连primitive type也UB? 06/16 09:50
12F:→ lovejomi: https://ideone.com/FjHpL0 这样写却没有建构子被呼叫 06/16 09:51
13F:→ lovejomi: 合理吗@@ 这样我补上解构 不就不对称了 06/16 09:51
14F:→ loveme00835: https://bit.ly/3d22Vlr 参考 [class.union]/6.3 还 06/16 10:50
15F:→ loveme00835: 有 06/16 10:50
16F:→ loveme00835: [class.union]/7 06/16 10:51
17F:→ loveme00835: https://wandbox.org/permlink/q3ZZFikhmqHmmFSK 06/16 11:05
18F:→ lovejomi: u.i.~int_t(); 我有私底下这样写但实在从来没看过 06/16 11:18
19F:→ lovejomi: 但这也证明了 endian那种用法在C++完全是个错误? 06/16 11:18
20F:→ lovejomi: 但也像我第一个问题讲的 这种UB真的是无法接受的吗? 06/16 11:19
21F:→ lovejomi: 您的例子 透过placement new才会有建构子呼叫 06/16 11:20
22F:→ lovejomi: 如果一开始就要用 u.s 该怎麽办呢 06/16 11:21
23F:→ lovejomi: https://wandbox.org/permlink/fmObYFTkDu6k6v3k 06/16 11:24
24F:→ lovejomi: 是不是 要调整s为第一个 并且 在 {{一定要写}} ? 06/16 11:25
25F:→ loveme00835: UB 是灰色地带, 只要你确定使用的编译器行为会如你预 06/16 11:26
26F:→ loveme00835: 期, 那 UB 就只是可携性比较差而已. 很多低阶的记忆 06/16 11:26
27F:→ loveme00835: 体操作都是 UB 要靠标准慢慢补完. 可以参考 [P0593] 06/16 11:26
28F:→ lovejomi: 恩 那 没跑到建构子是不是也是可接受? 06/16 11:50
29F:→ loveme00835: 当然不是这样说 0rz 你没有跑完 ctor 自然连 dtor 也 06/16 12:51
30F:→ loveme00835: 不会跑, 尤其是对有 side-effect 的 ctor 来说更是一 06/16 12:52
31F:→ loveme00835: 定要呼叫 06/16 12:52
32F:→ lovejomi: 我对side effect这词用在这领域没什麽感觉,可否给我一 06/16 19:18
33F:→ lovejomi: 些延伸资讯呢 谢谢 06/16 19:18
34F:→ loveme00835: 偶觉得你还是先把基础打好 06/16 20:17
35F:推 CoNsTaR: 想要有保障就用 inheritance,不要用 union 啊 06/21 11:02
36F:→ CoNsTaR: 要用 union 就要自己人脑生成 induction principles 和 06/21 11:07
37F:→ CoNsTaR: 检查所有 introduction/elimination 06/21 11:07







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灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP