【发布时间】:2018-08-10 22:16:30
【问题描述】:
似乎我并不完全理解 C++ 引用的工作原理。尝试运行以下 sn-p:
#include <vector>
#include <iostream>
int main() {
std::vector<int> test{1,2,3};
int& ref = test.back();
auto lambda = [&ref, &test](){
std::cout << "inside lambda " << ref << std::endl;
ref += 1;
for (auto&v : test) { std::cout << v << " "; }
};
lambda(); lambda(); lambda();
test.push_back(5);
lambda(); lambda(); lambda();
}
得到了这个结果:
inside lambda 3
1 2 4
inside lambda 4
1 2 5
inside lambda 5
1 2 6
inside lambda 6
1 2 6 5
inside lambda 7
1 2 6 5
inside lambda 8
1 2 6 5
为什么在push_back 完成后,向量元素都没有增加?
从这一刻起,ref 指向哪里?
【问题讨论】:
-
如果向量需要重新分配其数据存储,所有迭代器和指针以及对元素的引用都将失效。
-
因重新分配而死亡。矢量的内容移走了,但引用仍然存在并变得悬空。
-
这个问题与 lambdas 没有任何关系,没有它们你也会得到同样的结果。