Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我在自动&;中捕获返回值;,那会从我下面被摧毁吗?_C++ - Fatal编程技术网

C++ 如果我在自动&;中捕获返回值;,那会从我下面被摧毁吗?

C++ 如果我在自动&;中捕获返回值;,那会从我下面被摧毁吗?,c++,C++,以下面的代码为例: const std::string GetString() { return std::string(); } auto& thisIsANewString = GetString(); 在这种情况下会发生什么?它编译成功,但是auto引用是否保留了字符串?还是它被毁了,我就剩下一个孤儿 我之所以这样做是为了在返回值上保持const,而直接执行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之前,从技术上讲,编译器允许使用一个副本,但不需要对其进行优化。

您返回一个您创建的字符串,因此此ISanewString引用了该字符串。一旦该引用消失,字符串就会被销毁。如果不是写C++,而是返回一个新分配的对象,那么它就不会觉得奇怪了?或者我有一种强烈的感觉,就是这样,但我对引用的规则和PoTeN相比几乎不太熟悉。是的,有时候C++会让你从根本上重新考虑事情:但是在这种特殊情况下,如果这不起作用,那么很多C++代码就会被破坏。OOP,我知道Fro,但是我的术语不精确。C++的基本罪过!