在 C++ 中,判断一个对象是否为临时对象,核心看它是否有具名标识符,以及它的创建方式和用途,可以通过以下 3 个简单标准快速判断:
1. 看是否有变量名
没有变量名的对象,大概率是临时对象(匿名对象)。
- 临时对象: Node(kv); string(“hello”); (直接构造,无变量名)
- 非临时对象: Node n(kv); string s(“hello”); (有变量名 n / s ,是普通栈对象)
2. 看是否作为函数参数/返回值的临时载体
函数传参或返回时,未绑定到变量的对象,会生成临时对象。
voidfunc(Node n){}// 传参时生成临时 Node 对象,传给形参 nfunc(Node(kv));NodegetNode(){// 返回时生成临时对象,传递给函数调用处returnNode(kv);}3. 看是否是隐式类型转换产生的临时对象
某些场景下编译器会自动生成临时对象完成类型转换。
voidfunc(conststring&s){}// 字符串字面量 "test" 不是 string 对象,编译器生成临时 string 对象func("test");补充:临时对象的生命周期默认仅限当前完整表达式,但如果用 const 引用 绑定它,生命周期会延长至和引用相同。
// temp 是临时对象,被 const 引用绑定后,生命周期延长到函数结束constNode&ref=Node(kv);