2012-06-26 34 views
0
void fn(string &s) 
{ 
    //.... 
} 

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

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

后,我在参数添加常量,它编译。

但它是正确的对堆栈引用临时对象字符串(“HelloWorld”的)?

难道确认字符串( “HelloWorld” 的)被调用?

-

编辑。

如果创建一个临时字符串,编译器如何判断对象的字符串( “HelloWorld” 的)是的std :: string(为const char *)的构造常量?

+0

如果你问如果'string'对象将从'为const char *创建'那么答案是肯定的,你可以放心地使用你的函数内部的字符串。 – Dennis

+0

创建一个临时对象:[由构造函数转换](http://publib.boulder.ibm。COM /信息中心/ comphelp/v8v101/index.jsp的?主题=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr384.htm)。当'fn()'返回时,'std :: string'析构函数在对象作用域的末尾被调用。 –

回答

5

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

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

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

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

+0

编译器如何优化转换?如果被调用的函数需要一个'std :: string',并且给它一个'char const []',那么就必须发生一些事情。 –

+0

@JamesKanze如果函数内联并且什么都不做,该怎么办? –

+0

任何优化都必须根据“如果”规则进行。如果编译器可以确定程序的可观察行为将保持不变,则它可以执行任何操作。在这种情况下,它必须确定在构造函数和析构函数中没有“不可调用行为”,它不会调用它。 (理论上,在这种情况下这很简单:'std :: string'是标准库的一部分,编译器可以神奇地知道关于它们的所有信息。据我所知,没有一个可以,虽然在这种情况下'std :: string',这会很有意义。) –

2

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

是的,为什么不呢?

难道确认字符串( “HelloWorld” 的)被调用?

可以,只要string提供使用这garuanteed一个const char *参数的隐式构造(std::string这样做)。

4

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

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

+0

这是一个很好的点,从+1我... –