C 参考与宏替换一样工作

Do c++ references work like macro substitutions?

本文关键字:一样 工作 参考 替换      更新时间:2023-10-16
std::vector<int> v;
v.push_back(1);
int &r0=v[0],*p0=&v[0];
v.insert(v.begin(),0);
for (int i=2; i<1000000; i++) v.push_back(i);

我插入并添加其他元素后,整个向量可能会转移到其他内存位置?

那么R0和P0将返回什么?

如果向量发生了变化,我猜我猜P0会指向垃圾,但参考仍会起作用(即返回0(吗?引用类似于宏替代吗?

参考与宏替换不一样。

任何增加std::vector大小的操作都会使其end()迭代器无效。如果调整大小还增加了向量的容量(即重新关注基础内存(,则begin()迭代器也无效。

这意味着r0p0都可能无效。不需要检查和比较调整大小之前和之后的v.capacity()的结果(并且证实没有容量的变化(,不能保证r0p0参考或指向向量v的第一个元素。

用于更新向量的大小和容量的策略是实现定义的。鉴于您的代码正在插入一百万和一个元素(1000001(,因此容量在某个时候很可能会增加,并且r0p0均无效(即剩下的悬挂( - 实际上,std::vector的实现很少会使用添加该数量元素时不需要调整大小的策略。因此,实际上,r0p0都是无效的。

向量的地址(即&v(不会更改。由v管理的数据(v.capacity()v.size()v.data()v.begin()v.end()等(是(潜在的(会更改。

会更改。