→ loveme00835: 你的認知應該是從 C 語言來的, 所謂的 active member 06/16 02:09
→ loveme00835: 就是已經建構好的物件, 如果你要改用另外一個物件就 06/16 02:09
→ loveme00835: 必須要先解構當前的 active member 再去建構另一個, 06/16 02:09
→ loveme00835: 在 C++ 裡所有物件都要經過建構才能用, 只有將指標轉 06/16 02:09
→ loveme00835: 型無視這個規則的都是 UB 06/16 02:09
→ loveme00835: 對於 non-class object 也是同理, 建構子/解構子一整 06/16 02:12
→ loveme00835: 套流程缺一不可 06/16 02:12
→ loveme00835: 如果懶得自己處理就改用 std::variant 吧 06/16 07:34
→ lovejomi: 可是primitive type要怎麼建構解構(syntax)? 06/16 09:49
→ lovejomi: 如果要這樣 那之前在C work的union寫法 在C++是不是無法 06/16 09:50
→ lovejomi: 使用, 如我舉例的Endian 例子...連primitive type也UB? 06/16 09:50
→ lovejomi: 合理嗎@@ 這樣我補上解構 不就不對稱了 06/16 09:51
→ loveme00835: 有 06/16 10:50
→ loveme00835: [class.union]/7 06/16 10:51
→ lovejomi: u.i.~int_t(); 我有私底下這樣寫但實在從來沒看過 06/16 11:18
→ lovejomi: 但這也證明了 endian那種用法在C++完全是個錯誤? 06/16 11:18
→ lovejomi: 但也像我第一個問題講的 這種UB真的是無法接受的嗎? 06/16 11:19
→ lovejomi: 您的例子 透過placement new才會有建構子呼叫 06/16 11:20
→ lovejomi: 如果一開始就要用 u.s 該怎麼辦呢 06/16 11:21
→ lovejomi: 是不是 要調整s為第一個 並且 在 {{一定要寫}} ? 06/16 11:25
→ loveme00835: UB 是灰色地帶, 只要你確定使用的編譯器行為會如你預 06/16 11:26
→ loveme00835: 期, 那 UB 就只是可攜性比較差而已. 很多低階的記憶 06/16 11:26
→ loveme00835: 體操作都是 UB 要靠標準慢慢補完. 可以參考 [P0593] 06/16 11:26
→ lovejomi: 恩 那 沒跑到建構子是不是也是可接受? 06/16 11:50
→ loveme00835: 當然不是這樣說 0rz 你沒有跑完 ctor 自然連 dtor 也 06/16 12:51
→ loveme00835: 不會跑, 尤其是對有 side-effect 的 ctor 來說更是一 06/16 12:52
→ loveme00835: 定要呼叫 06/16 12:52
→ lovejomi: 我對side effect這詞用在這領域沒什麼感覺,可否給我一 06/16 19:18
→ lovejomi: 些延伸資訊呢 謝謝 06/16 19:18
→ loveme00835: 偶覺得你還是先把基礎打好 06/16 20:17
推 CoNsTaR: 想要有保障就用 inheritance,不要用 union 啊 06/21 11:02
→ CoNsTaR: 要用 union 就要自己人腦生成 induction principles 和 06/21 11:07
→ CoNsTaR: 檢查所有 introduction/elimination 06/21 11:07