Зачем удалять ссылочное значение элементом вектора не делает недействительным вектор? - PullRequest
1 голос
/ 24 января 2020

Я обнаружил хороший инструмент, предоставляемый std :: reference_wrapper, но мне это кажется странным.

#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <numeric>
int main()
{
    std::vector<int> vectorA(10);
    std::vector<std::reference_wrapper<int>> vec;
    std::iota(vectorA.begin(),vectorA.end(),0);

    for(auto i: vectorA){
        std::cout << "In vectorA: "<<  i << " ";
    }
    std::cout << "\n";

    for(unsigned i=0; i< vectorA.size(); i++){
        vec.push_back(std::ref(vectorA[i]));
    }

    for(auto i: vec){
        std::cout << "In vec: "<<  i << " ";
    }
    std::cout << "\n";

    vectorA.erase(vectorA.begin()+9);

    for(auto i: vectorA){
        std::cout << "In vectorA: "<<  i << " ";
    }
    std::cout << "\n";


    for(auto i: vec){
        std::cout << "In vec: "<<  i << " ";
    }
    std::cout << "\n";

}

Зачем стирать элемент, на который есть ссылка в ve c ( vectorA [9] ) не влияет на размер вектора ve c? Кроме того, почему vec [9] все еще доступен?

1 Ответ

2 голосов
/ 24 января 2020

std::reference_wrapper хранит ссылку на объект. Это никак не влияет на время жизни ссылочного объекта, и вы принимаете обязательство, что вы не будете пытаться использовать std::reference_wrapper после уничтожения ссылочного объекта. Наказанием за это является неопределенное поведение .

Таким образом, когда вы удаляете ссылочный элемент из vectorA, ссылочная оболочка в vec теперь недопустима, но это не знает, и вы не можете сказать . Любое использование этого ссылочного объекта-оболочки теперь будет вызывать неопределенное поведение.

Одним из возможных последствий неопределенного поведения является то, что ваша программа продолжает работать, и именно это происходит здесь. Вы пытаетесь использовать недопустимый объект-оболочку ссылки и получаете значение обратно, но это не значит, что программа действительна.

...