[問題] special function覺得困惑

作者: lovejomi (JOMI)   2018-10-03 23:56:59
一切是因為看到這篇文章
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;
}
請問我要怎麼取捨呢?
謝謝
作者: Caesar08 (Caesar)   2018-10-06 22:58:00
你可以google cppreference move constructor裡面有說明compiler幫你產生move constructor的條件

Links booklink

Contact Us: admin [ a t ] ucptt.com