如果没有对临时对象的常量引用,它会被删除吗

Will temporary object be deleted if there is no const reference to it?

本文关键字:删除 引用 临时对象 常量 如果没有      更新时间:2023-10-16

让我们看看这两个函数:

std::string get_string()
{
    std::string ret_value;
    // Calculate ret_value ...
    return ret_value;
}
void process_c_string(const char* s)
{
    std::cout << s << endl;
}

这里有两个可能的process_c_string调用,参数由get_string返回。

  1. 不绑定对get_string的返回对象的常量引用。

    process_c_string(get_string().c_str());
    
  2. 具有对get_string的返回对象的绑定常量引用。

    const std::string& tmp_str = get_string();
    process_c_string(tmp_str.c_str());
    

我知道第二种方法是有效的,但第一种方法呢,标准对这种情况有什么看法?get_string返回的临时对象会因为没有const reference而在process_c_str完成之前被删除吗?

注意:这两个版本在MSVC中都可以。

临时的生存期将扩展到创建它的完整表达式的长度。在您的情况下,临时文件将被销毁,但只有在对process_c_string的调用完成之后。只要函数不存储指针供以后使用,就可以了。

在第二种情况(引用的绑定)中,该临时的生存期被扩展为引用的范围,但我建议在这种特定情况下不要使用这种模式。您可以通过创建一个用临时初始化的本地字符串来获得相同的效果,并且代码更简单。(从性能的角度来看,所有编译器都消除了代码中潜在的额外副本,因此成本是相同的)