获取以下代码:
const std::string GetString()
{
return std::string();
}
auto& thisIsANewString = GetString();
在这种情况下会发生什么?它编译成功,但auto
引用是否保持字符串不变?还是它被销毁了,我只剩下一个孤立的参考?
我尝试这样做的原因是在返回值上维护const
,而直接使用auto
需要一个副本。
在这种情况下会发生什么?
引用绑定到一个临时对象,并扩展临时对象的生存期以匹配引用的生存期。
这在模板中非常有用,在模板中,您将能够平等地对待引用和作为引用包装器的对象。在模板之外使用临时生存期扩展只会让人感到困惑,但这是允许的。
而仅仅进行一次直接的自动使用需要一份副本。
只是澄清一下,这个程序中没有副本:
std::string GetString()
{
return {};
}
auto thisIsANewString = GetString();
至少从C++17开始。在此之前,从技术上讲,编译器是允许的,但不需要进行优化。在C++11之前,从技术上讲,编译器可以使用一个副本,但不需要对其进行优化。