c++ - 如果我在 auto& 中捕获返回值,它会从我下面销毁吗?
问题描述
采取以下代码:
const std::string GetString()
{
return std::string();
}
auto& thisIsANewString = GetString();
在这种情况下会发生什么?它编译成功,但auto
引用是否保留了字符串?还是它被破坏了,我留下了一个孤立的参考?
我试一试的原因是为了保持const
返回值,而直接auto
使用需要一个副本。
解决方案
在这种情况下会发生什么?
引用绑定到一个临时对象,并且临时对象的生命周期被延长以匹配引用的生命周期。
这在您将能够平等对待引用和引用包装器的对象的模板中很有用。在模板之外使用临时生命周期扩展只会令人困惑,但这是允许的。
而只是直接自动使用需要一个副本。
澄清一下,这个程序中有零个副本:
std::string GetString()
{
return {};
}
auto thisIsANewString = GetString();
...至少从 C++17 开始。在此之前,技术上允许编译器,但不需要优化。在 C++11 之前,技术上存在允许编译器但不需要优化的副本。
推荐阅读
- google-chrome - 桌面谷歌浏览器拼写检查是否受操作系统影响?
- httpwebresponse - How to fix Veracode error "Server-Side Request Forgery (SSRF)" when using HttpWebResponse?
- android - React-Native Error: Unable to resolve module
- computer-vision - 立体系统中的三角测量导致的深度误差
- html - 至少 3 个单词或更多,但使用阿拉伯语 [HTML 模式]
- python - 在多字串的空格之间添加一个字符
- c - C 一个无符号整数怎么可能只占用两个字节?
- javascript - regex for only lowercase letters and underscore
- javascript - 如何更改图例点的颜色?
- swift - recent messages with firestore - 1 second document write limit - swift