C++真正所谓的临时对象是不可见的——不会在你的源代码中出现。只要你产生一个non-heap object而没有为它命名,便诞生了一个临时对象。此等匿名对象通常发生于两种情况:
一是当隐式类型转换(implicit type conversions)被施行起来以求函数调用能够成功;
二是当函数返回对象的时候;
其实还有一种情况就是当你建立一个non-heap object对象,也就是无名对象的时候。
这里举一个常见的容易忽视的错误:
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
string s1("a"),s2("b");
const char * s = (s1+s2).c_str();
printf("%s\n",s);
}
这个程序运行的时候你可能会得到正确的结果,但事实上这里的做法是不安全的,s1+s2产生的临时对象会在表达式的结尾被析构,所以如果跟踪堆栈会发现在print语句中s的内存空间已经指向未知地址了。
这里针对3种会产生临时对象的情况举例进行说明:
1.隐式类型转换
void uppercasify(string& str);
// changes all chars in str to upper case
char subtleBookPlug[] = "Effective C++";
uppercasify(subtleBookPlug); //error!!!