初步了解匿名对象生命周期
- 1. 提出问题
- 2. 模拟验证
- 3. 得出结论
不知道有没有人和我一样,在vector的模拟实现部分对于resize接口的实现有一些疑问。
void resize(size_t n , const T& val = T())
{if (n > size()){reserve(n);for (size_t i = size(); i < n; i++)push_back(val);}else{_finish = _start + n;}
}
1. 提出问题
1.在实现resize的时候,使用了匿名对象作为缺省值,并且使用引用来进行接收我们学习过匿名对象,匿名对象的生命周期只在当前行为什么引用的匿名对象还可以在函数体内继续使用
2.对于int,double等内置类型,它们是否也有匿名对象?
2. 模拟验证
我们通过以下几个简单的样例来模拟当时的场景:
只有匿名对象:
此时其生命周期只有当前一行
匿名对象被const &接收:
此时该匿名对象的生命周期为到其所属作用域。
匿名对象作为缺省值:
此时该匿名对象存储在该函数的栈帧中,直到出了该函数作用域才会销毁。
匿名对象被静态成员变量引用:
此时该匿名对象的生命周期结束为整个程序结束时。
3. 得出结论
通过查阅资料以及上述的验证我们可以对问题得出初步结论:
1.int,double等内置类型在有了函数模板后进行了升级,它们有了匿名对象从而可以支持函数模板所给的缺省值。
2.如果匿名对象被const &接收,则其生命周期和存储位置与引用它的变量相同,这样可以改变匿名对象的生命周期。
对于匿名对象的更深层次了解需要和右值引用相结合,在学习到右值引用时再来更多了解学习匿名对象。
以上是本次所有内容,希望有所帮助,谢谢观看。