【问题标题】:Extending object lifetime延长对象生命周期
【发布时间】:2010-10-12 18:48:22
【问题描述】:

这样的 fnc 会延长返回对象的生命周期吗?如果没有,有没有办法做到这一点?

 const int& f () //<<----Here you see, I'm returning by ref to const int
 {
     return 1;
 }

【问题讨论】:

    标签: c++


    【解决方案1】:

    不,它不会延长对象的生命周期。

    您无法延长临时对象的生命周期(创建一个临时对象以绑定到引用),但是,您可以这样做

    int f() { return 1; }
    

    :-)

    干杯,

    --阿尔夫

    【讨论】:

    • @flynt:对不起,不,接下来会发生什么,从正式的 POV 中,为不确定的值创建了一个新的引用。在实践中,这将是原始的int(实际上它还没有时间被乱码)。然而,如果你用析构函数类型的对象尝试这个技巧,你可能会大吃一惊……
    • 我不确定标准是否真的要求它,但由于 RVO,没有理由过早删除,因此 gcc 不会
    • @flynt:该标准支持 RVO(通过允许省略复制构造),但它不需要 RVO。通过返回对局部变量的引用来延长局部变量的生命周期可以通过 RVO 工作,但这只是未定义行为的一种情况,它使用具有特定选项的特定编译器执行人们想要执行的操作。 UB 可以做任何事情,包括非常不受欢迎的事情。
    【解决方案2】:

    我不认为这会编译(使用常量),但如果你编译了类似的东西,它会因未定义的行为而导致运行时失败。

    不会延长任何生命周期,因此您将 ref 返回给不再存在的 var/const。

    【讨论】:

    • 它必须按照语言规则编译。他们对作为函数结果的引用的绑定也不例外(尽管好的编译器可能会发出警告)。但是,是的,到第二段。 :-)
    猜你喜欢
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2019-01-06
    • 2015-05-03
    • 1970-01-01
    相关资源
    最近更新 更多