C_and_CPP 板


LINE

※ 引述《firose (guest也是也是也是也是也)》之銘言: : ※ 引述《omomo34415 ( )》之銘言: : : 請問auto_ptr的實作中為什麼要多定義 : : auto_ptr(auto_ptr_ref<T> rhs) throw() : ap(rhs.yp) { : : } : : auto_ptr& operator= (auto_ptr_ref<T> rhs) throw() { // new : : reset(rhs.yp); : : return *this; : : } : : template<class Y> operator auto_ptr_ref<Y>() throw() { : : return auto_ptr_ref<Y>(release()); : : } : : template<class Y> operator auto_ptr<Y>() throw() { : : return auto_ptr<Y>(release()); : : } : : 其他的CODE的在http://www.josuttis.com/libbook/util/autoptr.hpp.html : : 看不太懂這些出現的時機。 : 因為 auto_ptr 的 ctor 是 explicit 的, 導致不能把一個 pointer 設給 auto_ptr : 所以他才用一個 aotu_ptr_ref 讓指標可以做一次 user-define conversion 然後再 : 經由接受 auto_ptr_ref 的 auto_ptr constructor 讓這個行為可以 work. 不是的,auto_ptr_ref 並不是用在這種地方。 想像以下的程式碼: auto_ptr<int> foo(); void bar() { ... auto_ptr<int> p_base = foo(); } foo() 回傳的是一個暫時物件,但 auto_ptr 的 copy constructor 接受的卻是 non-const reference,這樣會造成編譯錯誤,因為暫時物件無法以 non-const reference 的型式傳遞。解決之道是先把 auto_ptr 隱式轉型成 auto_ptr_ref, 然後讓 auto_ptr 的 constructor 可以接受 auto_ptr_ref 作為參數。 auto_ptr_ref 應該只用來做這類的轉換,而不應該拿來轉換一般的 pointer。 像以下的 code: auto_ptr<int> p = new int(10); 在 VC 上,右邊的 int* 會被隱式轉換成 auto_ptr_ref,然後再送到 auto_ptr 的 constructor 中。這並不是正確的行為,VC 應該把 auto_ptr_ref 的 constructor 宣告為 explicit。 : 問題是 auto_ptr 為什麼要 explicit ? 因為如果他不這樣做的話, 然仍不能把指標 : 設給 auto_ptr , 因為它的 copy constructor/assignment 是接受 non-const 參考 這樣說就不對了 當你有一個 constructor 接受指標當作參數時 直接用指標去初始化並不會呼叫 copy constructor 也不會呼叫 copy assignement template <typename T> class auto_ptr { public: auto_ptr(T* p) {...} // 沒有 explicit auto_ptr(auto_ptr<T>& p) {...} // copy constructor }; auto_ptr<int> p = new int(10); 上述的程式碼會合法呼叫 auto_ptr<int>::auto_ptr<int>(int*),而不會去呼叫 copy constructor。 : 會這樣設計是因為它的內容呼叫 auto_ptr::release 這個函式會把內含指標 ap 設成 0 : 使 auto_ptr 可以順利把指標的擁有權轉移, 不會在 ~auto_ptr 刪除他, 所以 release : 會是 non-const. 如果 copy constructor/assignment 接受 const reference 的話 : 是不能呼叫 non-const release 的, 所以它在這個設計裡必須是 non-const auto_ptr 的 constructor 必需宣告為 explicit,否則當指標被隱式轉型成 auto_ptr 時,使用者會發現他在預期外的地方失去了指標的所有權: void foo(auto_ptr<int> p); // foo 結束時,p 會自動被釋放 void bar() { int* p = new int(10); foo(p); // 失去了 p 的所有權,但使用者一無所知! delete p; // 重覆釋放 p,悲劇一場 } 使用 explicit constructor 可以讓使用者清楚地知道自己做了什麼事: void bar() { int* p = new int(10); foo( auto_ptr<int>(p) ); // 把 p 轉為 auto_ptr,我們已失去所有權 } --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.87.151.2
1F:推 firose:嗯, 你說的對, 你的第二段地部分我忽略了導致錯誤的想法 04/30 12:29
2F:→ firose:第三段才是真正的原因~ 小弟對不起原 PO ... sorry = = 04/30 12:30
3F:→ firose:所以說 auto_ptr_ref() 應該要 explicit 不然一樣不太正確 04/30 12:31
4F:推 firose:比較好奇的是 auto_ptr_ref 如果 explicit 那為何需要他? 04/30 12:51
5F:→ littleshan:我的第一段就是解釋為何需要 auto_ptr_ref 04/30 13:02
6F:→ littleshan:因為要讓 function 回傳的暫時物件能夠 assign 04/30 13:03
7F:推 firose:您指的暫時物件是 auto_ptr 還是 auto_ptr_ref? 04/30 13:04
8F:→ firose:我的意思是如果兩個都 explicit 那不如建構暫時 auto_ptr 04/30 13:11
9F:→ firose:如果他本來就 auto_ptr 我也不需要用轉型運算子轉成 04/30 13:12
10F:→ firose:auto_ptr_ref 直接遞交 ownership 就好了? 04/30 13:13
11F:→ firose:除非當時因為某種原因 foo 已經明確建構出 auto_ptr_ref 04/30 13:14
12F:→ firose:不然似乎很奇怪, 但若 auto_ptr_ref 不 explicit 似乎仍然 04/30 13:15
13F:→ firose:會有第三段所說的問題? 04/30 13:16
14F:推 VictorTom:看完諸位強者的討論, 小弟我認真的覺得自己不懂程式Orz. 04/30 13:20
15F:→ firose:抱歉! 我想應該是在 foo 建構 auto_ptr_ref<T>(pointer) 04/30 13:22
16F:→ firose:然後回傳的時候直接呼叫 auto_ptr_ref 版的 auto_ptr建構式 04/30 13:23
17F:→ firose:因為直接建構 auto_ptr 不能拷貝, 他用 auto_ptr_ref 提供 04/30 13:24
18F:→ firose:一個拷貝的途徑, 但是他應該 explicit 使用者也應該明確建 04/30 13:25
19F:→ firose:這樣的意思應該是說在拷貝前不需建構 temp auto_ptr 因為編 04/30 13:27
20F:→ firose:編譯器會發現這不必要, 所以會 optimize 掉! 04/30 13:28







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