如何解决返回对隐式构造参数的引用与隐式构造的内部对象
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 举报,一经查实,本站将立刻删除。