2012-01-26 62 views
5

让我们来看看这两个功能:如果没有const引用它,是否会删除临时对象?

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_stringget_string返回参数两种可能的调用。

  1. 没有绑定const引用返回的对象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返回的临时对象会在process_c_str之前被删除,因为它没有const reference吗?

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

回答

6

临时的生命周期延伸到创建它的完整表达式的长度。在你的情况下,临时将被销毁,但只有在拨打process_c_string后才能完成。只要该函数不存储指针供以后使用,就没问题。

在第二种情况下(引用的绑定),该临时的生命周期被扩展为引用的范围,但在这种情况下,我会建议针对该模式。通过创建一个使用临时对象初始化的本地字符串,代码更简单,您将获得相同的效果。 (从性能角度来看,所有编译器都会隐藏代码中的潜在额外副本,所以成本将相同)

相关问题