看板 C_and_CPP 關於我們 聯絡資訊
一切是因為看到這篇文章 https://quuxplusone.github.io/blog/2018/07/07/defaulted-destructor-inhibits-mo ve/ 覺得有趣 然後測試了一下 https://ideone.com/B2ZuZf 的確真的是這樣.... 但這問題令我很困惑 我知道這些special function有implicit compiler幫產生 或是 會被implicit delete.. . 0.對我來講 "有" or "被delete" 二選一 但這是例外? 還是情況(規則)比我想像的更是 複雜許多 1. 為什麼這情況 move會整個"失效", 但 is_move_constructible顯示 true? 接著測試RVO相關 https://ideone.com/xTWkSJ 詭異了....這三組乍看可以說是一樣的 但....結果只有Foo 可以RVO 於是試著歸納目前的結果 2. 只要class 有寫 move or copy 只要擇一不是default (就是{空}) , RVO就會發生 如 https://ideone.com/iByEyO 如果RVO能不能做到取決於是不是寫default 根本沒道理啊? 這樣pod struct 看來是無法 rvo? 以上實在是讓我一頭霧水 我用VC 測試結果竟也一樣(難道是standard 規範?) 最後得到一個結論 因為=default 跟 {} 經驗顯示 不是完全相等(cstr / dstr) 而且似乎依照以上實驗可以說{} 比寫=default更穩 3. 是不是我可以說 要寫一個完美的class 請遵守 rule of five + special function若是default行為請把 定義跟宣告分開(說真的沒看過這樣寫) 或 是能用{}就用{} 如 https://ideone.com/14mLze (這樣就會RVO) 提到rule of five 4. 想順便問一下 如果定義一個 interface class "通常" 大家會怎麼寫? 如果遵守rule of five 會變成這樣 https://ideone.com/cm6rkb 但總覺得通常看到的寫法會是直接 class Interface { public: virtual ~Interface() = default; } 請問我要怎麼取捨呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.9.97.234 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1538582230.A.C68.html ※ 編輯: lovejomi (39.9.97.234), 10/04/2018 00:01:16
Caesar08: 你可以google cppreference move constructor 10/06 22:58
Caesar08: 裡面有說明compiler幫你產生move constructor的條件 10/06 22:59