使用参考

时间:2012-06-26 08:37:04

标签: c++

void fn(string &s)
{
    //....
}

//use the function    
fn("helloworld");

首先,使用const char字符串启动非const字符串是错误的。

在参数中添加const后,它会编译。

但是在堆栈上引用临时对象字符串(“helloworld”)是对的吗?

是否确定会调用字符串(“helloworld”)?

-

修改。

如果创建了临时字符串,编译器如何从std :: string(const char *)的构造函数判断对象字符串(“helloworld”)是否为const?

3 个答案:

答案 0 :(得分:5)

  

但是在堆栈上引用临时对象字符串(“helloworld”)是对的吗?

是的,只要引用为const,临时的生命周期就会延长。

  

是否确定会调用字符串(“helloworld”)?

是的,使用转换构造函数std::string(const char*)创建临时值。但请注意,编译器可以优化此步骤。

答案 1 :(得分:3)

  

但引用临时对象字符串(“helloworld”)是否正确   在堆栈上?

在这种情况下,可能,但你必须注意对象的生命周期。临时性将在完整表达结束时不再存在;如果fn保存指针或对它的引用,则会遇到麻烦。这通常不是免费功能的问题,例如fn(但它可以);如果临时是new表达式中的构造函数的参数,则可能会出现问题(但该类的作者应记录超出构造函数调用的任何生命周期要求)。

答案 2 :(得分:2)

  

但是在堆栈上引用临时对象字符串(“helloworld”)是对的吗?

是的,为什么不呢?

  

是否确定会调用字符串(“helloworld”)?

是的,因为long string提供了一个使用const char *参数的隐式构造函数,所以它是有效的(std::string就是这样)。