微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

返回对隐式构造参数的引用与隐式构造的内部对象

如何解决返回对隐式构造参数的引用与隐式构造的内部对象

C++11 问题

试图了解我在代码中遇到的一个问题。不是在寻找“正确”的方法来做到这一点,只是想知道这应该如何工作,以便我可以弄清楚将来如何解决问题

我认为函数 f1() 可以很好地返回对与 p1 在同一行隐式构造的 temp 的引用

但是p2呢?调用 f2() 时,临时在 f1() 的主体中隐式构造,但 f2() 正在返回由 f1() 返回的引用。我认为临时的生命周期被延长以匹配引用的生命周期

询问是因为在我们的一个编译器中 p2 在下一次是垃圾,但在其他编译器中不是

struct PP
{
    int i;
    PP(int i_) : i(i_) {}
};


const PP &f1(const PP &p) 
{
 return p; 
}

const PP &f2(int i) 
{
 return f1(i); 
} // does the temp live here after return?

int main()
{
    const PP &p1 = f1(1);
    const PP &p2 = f2(2);  // is p2 valid on the NEXT line
    return 0;
}

解决方法

我认为这是未定义的行为,不同编译器有不同输出的事实表明了这一点。

f2 中,您将返回由 f1 构造的引用,它本身具有对本地对象 i 的引用。在作用域的末尾,i 消失并使引用无效。

事实上 clang-tidy 检测到这个 godbolt example

也在 reference initialization of cppreference 中声明,作为生命周期延长的例外:

在返回中临时绑定到函数的返回值 语句不扩展:它在结束时立即销毁 返回表达式。这样的 return 语句总是返回一个悬空 参考。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。