首页 > 解决方案 > 如果我在 auto& 中捕获返回值,它会从我下面销毁吗?

问题描述

采取以下代码:

const std::string GetString()
{
    return std::string();
}

auto& thisIsANewString = GetString();

在这种情况下会发生什么?它编译成功,但auto引用是否保留了字符串?还是它被破坏了,我留下了一个孤立的参考?

我试一试的原因是为了保持const返回值,而直接auto使用需要一个副本。

标签: c++

解决方案


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

引用绑定到一个临时对象,并且临时对象的生命周期被延长以匹配引用的生命周期。

这在您将能够平等对待引用和引用包装器的对象的模板中很有用。在模板之外使用临时生命周期扩展只会令人困惑,但这是允许的。

而只是直接自动使用需要一个副本。

澄清一下,这个程序中有零个副本:

std::string GetString()
{
    return {};
}

auto thisIsANewString = GetString();

...至少从 C++17 开始。在此之前,技术上允许编译器,但不需要优化。在 C++11 之前,技术上存在允许编译器但不需要优化的副本。


推荐阅读