5

让我们看一下这两个函数:

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_stringwith 参数返回的get_string

  1. 没有绑定 const 对返回对象的引用get_string

    process_c_string(get_string().c_str());
    
  2. 使用绑定 const 引用返回的get_string.

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

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

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

4

1 回答 1

6

临时变量的生命周期会随着创建它的完整表达式的长度而延长。在您的情况下,临时文件将被销毁,但仅在调用process_c_string完成后才会被销毁。只要该函数不存储指针以供以后使用,就可以了。

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

于 2012-01-26T13:30:59.880 回答