C_and_CPP 板


LINE

※ 引述《klsdf (静雨澪)》之铭言: : 标题: [问题] 右值参照问题 : 时间: Wed Sep 28 21:20:59 2016 本文主要是讲lifetime of a temporary object,所以把回文的标题改了 我在你的内文说到"reference不管是lvalue reference还是rvalue reference" "都不会延长被reference的object的生命周期" 其实这是错误的(抱歉,我误导你了 <(_ _)> ) 然後板上又没有相关的资料(查temporary/暂时/生命/lifetime),所以就写这篇文章 另外,先说一件跟本文章没关系的事情 以我的经验,C++ 3大compiler(GCC、Clang、MSVC) MSVC(也就是VC++)是最不符合C++标准的 也就是你的code明明可以通过MSVC的compile,却不能通过GCC与Clang的compile 让你以为GCC跟Clang怎麽那麽烂 但实际的情况是MSVC本身有问题,GCC跟Clang才是尽可能符合C++标准的 所以如果当你的code没办法通过GCC与Clang的compile,别怀疑,是你的code有问题 正文开始: 实际上,reference(如果没有特别说明,下文的reference都包含lvalue reference与 rvalue reference,把reference to const改成rvalue reference也可以) 是会延长temporary object的lifetime的,除了3种情况 先讲一下甚麽是延长lifetime,如果写 int test(){ return 10; } int main(){ const int &i=test(); //... cout<<i<<endl; } 原本在const int &i=test()结束,会destroy temporary object的动作,被挪到 i的lifetime结束才执行,所以cout会正确无误地,把10印出去 这种情况,就是temporary object的lifetime被延长了 但是呢,并不是所有reference都能延长temporary object,例如(其中1种例外情况) string get(){ return "abc"; } struct Test{ const string &str; //oops, dangling reference Test(const string &a) :str{a}{} }; int main(){ Test test(get()); } 那当test(get())结束时,Test::Test的parameter a所reference的object就被destroy了 也就是说,test里面的str,就会是一个dangling reference 可能有人会问为甚麽 "test.str reference a,a又reference get()的return value" "所以get()的return value(temporary object)被a延长,a又被str延长,不行吗?" 答案是不行 因为虽然Test::Test的parameter是reference,但 延长temporary object lifetime的规则,在"function的parameter是reference时"无效 所以test.str真的会是一个dangling reference 最後,讲那麽多,还是要来回答你原本的问题 : 但就我的认知如果是直接用const auto& =test() 去接了话 : 可以活在do while一个round里(用VC run的结果是这样) : 但用DerivedRef接看起来是下一行就结束周期 : 这就是我不了解的地方 因为现在用const auto &a=test(),所以test()的return value(temporary object) 的确被a延长了 所以在while结束的时候,temporary object才会被destroy 但是,DerivedRef的案例不一样 首先,你的Any template(http://codepad.org/XT2ed7Hc)的assignment operator 并没有test这个class type,有的只是 operator=(const Any& a)与operator=(Any&& a) 也就是说,在你的code(http://codepad.org/CZhy27AQ)40行 "any = test();" test()产生的temporary object,需要先转成Any这个class type 他会先呼叫template<typename U>Any(U&& value)这个constructor 然後此时的value虽然是reference,但是他是延长temporary object的例外情况 所以当any = test()执行结束後,ptr->value就是一个dangling reference : → firose: DerivedRef 就算被 const T& 也不能活超过 do-block 09/29 12:4 : → firose: 说错, 是 test(), 只是这里问题是它能活多久? 09/29 12:4 它只能活到any = test()这个expression结束 : 我的疑问是它太早死了QQ 它没有太早死,它死的时机刚刚好 注: 在文章一开头有说到MSVC不符合C++标准的问题,现在这里就是了 在(http://codepad.org/XT2ed7Hc)里struct DerivedRef的T& value这种写法 在遇到any = test()就会出错,因为你用lvalue reference reference rvalue reference 这段code拿去给GCC跟Clang compile,会发现他们两个都跟你说compile失败 不是GCC跟Clang有问题,真正有问题的是MSVC --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.114.233.71
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1475154363.A.F23.html
1F:推 pttworld: yoco 09/29 21:42
2F:推 hn12404988: 09/29 22:06
3F:推 Feis: ... 09/29 23:33
我有看到你的 暂时物件的生命周期 但我觉得跟本文章内容讨论的有点不同,所以才写这个的啦
4F:推 CoNsTaR: 推 09/30 07:13
5F:推 klsdf: 感谢Caesar大的解释,我昨天下班的时候有看你贴的连结 09/30 08:43
6F:→ klsdf: 我看完的那时候的理解是原本test()诞生时是rvalue 09/30 08:43
7F:→ klsdf: 被const auto & = test()後成为具名的rvalue 就是lvalue 09/30 08:44
8F:→ klsdf: 所以会等const auto &的scope结束後才会delete 09/30 08:44
9F:→ klsdf: 而我的DerivedRef内的const T&把test()rvalue ref进来时 09/30 08:46
10F:→ klsdf: 并没有被Compiler辨识出为具名的rvalue,我原本也是理解 09/30 08:47
11F:→ klsdf: 因为是函数呼叫关系导致Compiler无法推导出它是具名rvalue 09/30 08:49
12F:→ klsdf: 经由这篇文章我可以理解为什麽了,谢谢Caesar大。 09/30 08:50
13F:推 bluesoul: 好文 09/30 11:41
※ 编辑: Caesar08 (140.114.233.71), 12/02/2016 00:26:16







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灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP