[问题] 右值参照问题

楼主: 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