【问题标题】:Not seeing the effects of action on a vector's last element via a reference [duplicate]没有通过参考看到动作对矢量最后一个元素的影响[重复]
【发布时间】: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 没有任何关系,没有它们你也会得到同样的结果。

标签: c++ c++11 reference


【解决方案1】:

一开始,ref 引用了test 存储的第三个元素。在推回一个新元素之后,vector 会重新分配其存储空间,因此旧的ref 元素不再有效。您的代码会导致未定义的行为

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-08
    • 2018-07-30
    • 1970-01-01
    • 2020-05-30
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多