如果我在 auto& 中捕获返回值,它会从我下面销毁吗?

  • 本文关键字:auto 返回值 如果 c++
  • 更新时间 :
  • 英文 :


获取以下代码:

const std::string GetString()
{
return std::string();
}
auto& thisIsANewString = GetString();

在这种情况下会发生什么?它编译成功,但auto引用是否保持字符串不变?还是它被销毁了,我只剩下一个孤立的参考?

我尝试这样做的原因是在返回值上维护const,而直接使用auto需要一个副本。

在这种情况下会发生什么?

引用绑定到一个临时对象,并扩展临时对象的生存期以匹配引用的生存期。

这在模板中非常有用,在模板中,您将能够平等地对待引用和作为引用包装器的对象。在模板之外使用临时生存期扩展只会让人感到困惑,但这是允许的。

而仅仅进行一次直接的自动使用需要一份副本。

只是澄清一下,这个程序中没有副本:

std::string GetString()
{
return {};
}
auto thisIsANewString = GetString();

至少从C++17开始。在此之前,从技术上讲,编译器是允许的,但不需要进行优化。在C++11之前,从技术上讲,编译器可以使用一个副本,但不需要对其进行优化。

最新更新