[問題] 右值參照問題

作者: klsdf (靜雨澪)   2016-09-28 21:20:59
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++
問題(Question):
關於右值參照跟右值的生命週期
預期的正確結果(Expected Output):
class test暫存值被move進DerivedRef中的T&,等DerivedRef被解構後才會消失。
錯誤結果(Wrong Output):
class test暫存值執行完後就被直接解構。
程式碼(Code):(請善用置底文網頁, 記得排版)
any template:
http://codepad.org/XT2ed7Hc
test main code:
http://codepad.org/CZhy27AQ
補充說明(Supplement):
目前自行在網路上找any在C++ 11的實作的code,
但看到的Sample Code並沒有使用右值參照來儲存的,
想請教板上的各位前輩是否是我實作的方法有誤還是實作上理論是不可行的?
因為我原本的想法是在:
any = test();
test()會回傳一個右值暫存值,move進DerivedRef的T &,
可以減少不必要的物件複製,但結果看起來執行完後暫存值就解構了,
T&收到的是不合法的Ref,導致Exception,
煩請各位前輩指教小弟觀念錯誤的地方,謝謝。
作者: Caesar08 (Caesar)   2016-09-28 21:29:00
你拿lvalue reference去接rvalue reference應該是const T &才對不過any內部不應該是reference,他應該是要自己有object所以應該是T才對,才符合&->copy,&&->move等等,你說的是C++17的any嗎?因為用reference去接,test()執行完就會呼叫destructorreference不會延長object的生命時間唯一的辦法就是用T來接難道你要的是&->reference,&&->move?不具名的暫存物件,阿你不把他存起來,等等就解構了你可以用template<class T>Any(U&& value),但要用T存
作者: CoNsTaR ((const *))   2016-09-28 22:18:00
你沒辦法回傳 rvalue reference 啊但是你可以傳 lvalue reference 或是閉包進去直接用
作者: pttworld (批踢踢世界)   2016-09-28 22:43:00
dynamic_cast<DerivedRef<T>*> (ptr.get());以上只是過程是跑出果,要看想練習什麼。
作者: Caesar08 (Caesar)   2016-09-28 23:49:00
reference不管是lvalue reference還是rvalue reference都不會延長被reference的object的生命週期你的test()在const auto &tref = test();之後,仍然解構如果你寫的是template<class T>...(T &&val)這叫做"forwarding reference"或"universal reference"並不是寫&&,之後就會都用move或是copy#19gioP8j看這篇吧
作者: firose (guest也是也是也是也是也)   2016-09-29 12:40:00
DerivedRef 就算被 const T& 也不能活超過 do-block說錯, 是 test(), 只是這裡問題是它能活多久?

Links booklink

Contact Us: admin [ a t ] ucptt.com