C++大概是这个世界上最飘逸、成功、失败的语言吧,临时对象是C++语言中最复杂的东西之一。
以下代码段新手大概经常会写吧:
std::string FetchFormat(){
return "%d";
}
int main(){
printf(FetchFormat().c_str(), 100);
}
这个代码在大多数时,会跑得“很好”,然而,如果有一天你听到崩溃的碎片声,你也不应有任何不快。在这个程序中使用了一个从FetchFormat()调用返回的临时对象,在main函数中调用printf时,对第一个参数求值完成时,这个临时对象可能被析构,如果这个临时对象被析构,当进入printf函数体内时,自然地会崩溃了。
C++中对临时对象的定义为:一切非显式定义和生成的对象均为临时对象。至于临时对象何时被析构呢,根据《C++语言的设计与演化》知道,历史上对这个问题曾经有很多的争议,也提出过很多建议,最后老大发话了,在生成临时对象的最大表达式结束处即是临时对象的析构处(EOS,end of statement)。
至于什么时表达式,C++标准中对将表达式定义为:由操作数、操作符、函数调用构成的式子。int x = 1;int x, y;
double xxx