Iniziamo con questo codice di esempio in C++:comportamento strano di riferimento vector.back() dopo vettore viene modificata
#include <vector>
#include <iostream>
int main()
{
std::vector<int> vec;
vec.push_back(0);
for (int i = 1; i < 5; i++)
{
const auto &x = vec.back();
std::cout << "Before: " << x << ", ";
vec.push_back(i);
std::cout << "After: " << x << std::endl;
}
return 0;
}
Il codice viene compilato con g++ test.cc -std=c++11 -O0
e seguenti è il risultato:
Before: 0, After: 0
Before: 1, After: 0
Before: 2, After: 2
Before: 3, After: 3
mi aspettavo la seconda linea di uscita per essere
Before: 1, After: 1
dal x
è un riferimento a un elemento nel vettore, che non deve essere modificato aggiungendo elementi al vettore.
Tuttavia non ho letto il codice smontato o non ho fatto altre indagini per ora. Inoltre, non so se si tratta di un comportamento indefinito nello standard del linguaggio.
Voglio che questo sia spiegato. Grazie.
Ci dispiace, ma non c'è nulla di correlato con gli iteratori. – starrify
@starrify: prova a procurarti una copia invece di un riferimento al valore dietro "indietro". –
@KirilKirov Sì, questo è anche quello che sospetto, e voglio essere sicuro che questo sia il problema (citando lo standard o leggendo il codice assembly generato o whatelse) – starrify