看板 C_and_CPP 關於我們 聯絡資訊
心血來潮想測試一下類別裡的 ref 成員是否可以改變參考到的對象 測試類別: struct object { int &ref; object( int &i ) : ref ( i ){ } }; 當小弟一開始寫下: int i = 10; object a( i ); int j = 5; object b( j ); assert( &a.ref != &b.ref ); a = b; // error! VC10 & gcc 都會報錯 : non-static reference member 'int& object::ref', can't use default assignment operator 用正當的方式不能達到 memberwise copy, 那就用 memcpy 好了: assert( &a.ref != &b.ref ); memcpy( &a, &b, sizeof(a) ); assert( &a.ref == &b.ref ); 過了! 藉由此方式還是可以改變 ref 參考到的對象, 想要只改變 特定的參考成員: assert( &a.ref != &b.ref ); memcpy( (char*)&a + offsetof(object, ref), (char*)&b + offsetof(object, ref), sizeof(void*) ); assert( &a.ref == &b.ref ); 也過了! 只不過 gcc 會給錯誤訊息卻可以正常執行(offsetof): [Warning] invalid access to non-static data member 'object::ref' of NULL object VC10則是會保護該區塊不被讀取, 造成執行時期錯誤...(上一例卻 不會? 第二個方法在加入新成員後有可能不會改到) 有關以上行為的規定到了 n3242 似乎也沒有半點著墨...寫 C++還 是蠻危險的...= = -- ▂▂ ▄▂ T.T.L Listen 2 http://ppt.cc/jIUk ˇ ˇˇ ˇ 說什麼結束 ▃▃ http://ppt.cc/zQtB ψ髮箍 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115
holymars:ref都是用pointer實作的,會有這樣的行為很意外嗎.. 04/09 15:02
不意外阿, 所以我才會假設它的大小為 sizeof(void*)
holymars:對compiler來說ref就是個他要幫你多做很多處理和判斷的指 04/09 15:03
holymars:標,你還要這樣惡搞它 它就雙腳一伸不理你也是合理的 04/09 15:03
uranusjr:沒事惡搞編譯器有什麼好處嗎... 04/09 17:37
如果這樣的行為標準裡有定義的很明確, 而不是送你一句 "the behavior is undefined." 那麼使用者就有權這樣作, 甚至還可以達成像C#中Accessor的功能 , 我還要再翻翻有關此類複製行為的規範, 這並不是惡搞..只是想 發掘新用法 ※ 編輯: loveme00835 來自: 140.121.197.115 (04/09 19:35)