<The c++ programming Language>中提到的临时变量:见10.4.10节
其中有这样一个例子:
void f(string& s1,string& s2,string& s3) { const char* cs = (s1+s2).c_str(); cout<<cs; if( strlen(cs=(s2+s3).c_str())<8 && cs[0] == ‘a‘){ //cs used here } }
刚开始还以为没什么错误,后来经过测试发现,cs中的内容是不确定的。
主要是因为(s1+s2)生成的临时变量在其所在语句执行完毕后已经销毁了,所以保存的字符串对象也不存在了,该内存空间已经被重新分配
但是,下面的代码是正确的:
void f(string& s1, string& s2,string& s3) { cout<<s1+s2; //可以正常输出,临时变量的生命周期在当前语句 string s = s2+s3; //可以正常使用,因为临时变量的内容已经通过拷贝复制函数传递 } void h(string& s1, string &s2,string& s3) { const string& s = s1+s2; //书中说只能绑定到常量引用,因为这是一个临时变量,并不是因为临时变量一定是const,而是因为其可能随时销毁。 }
但是似乎又和实现有关,参考:
http://msdn.microsoft.com/zh-cn/library/cfbk5ddc(v=vs.90).aspx
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=939006