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

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

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

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

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

确定调用了 string("helloworld") 吗?

--

编辑。

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

4

3 回答 3

5

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

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

确定调用了 string("helloworld") 吗?

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

于 2012-06-26T08:39:55.550 回答
3

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

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

于 2012-06-26T08:56:51.130 回答
2

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

是的,为什么不?

确定调用了 string("helloworld") 吗?

是的,只要string使用 const char* 参数提供一个隐式构造函数,这就是保证(std::string这样做)。

于 2012-06-26T08:42:26.340 回答