void fn(string &s)
{
//....
}
//use the function
fn("helloworld");
首先,使用const char字符串启动非const字符串是错误的。
在参数中添加const后,它会编译。
但是在堆栈上引用临时对象字符串(“helloworld”)是对的吗?
是否确定会调用字符串(“helloworld”)?
-
修改。
如果创建了临时字符串,编译器如何从std :: string(const char *)的构造函数判断对象字符串(“helloworld”)是否为const?
答案 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
就是这样)。