This issue is very strange, I have following code:
#include <iostream>
#include <thread>
#include <chrono>
#include <string>
#include <vector>
struct Data {
    Data(const char * d)
        :data(d){}
    std::string data;
};
// Using these data to avoid SOO(aka small object optimize) ASAP
std::vector<Data> arr {"11111111111111111111111111111111111111111111111111111111",
                        "2222222222222222222222222222222222222222222222222222222",
                        "3333333333333333333333333333333333333333333333333333333",
                        "4444444444444444444444444444444444444444444444444444444",
                        "5555555555555555555555555555555555555555555555555555555"};
class Test {
public:
  void test() {
    // I get a valid iterator first
    std::vector<Data>::iterator it = arr.begin();
    // I run a thread to clear arr
    std::thread([](){
          std::this_thread::sleep_for(std::chrono::seconds(2));
          arr.clear();
        }).detach();
    // sleep 3s to make following code run after thread
    std::this_thread::sleep_for(std::chrono::seconds(3));
    // I think it->data is a invalid operation, Howerver, it works :(
    std::string res = it->data;
  }
};
int main() {
  Test test;
  test.test();
  std::this_thread::sleep_for(std::chrono::seconds(5));
  return 0;
}
This case shows visiting a iterator after calling clear(), theoretically it is a invalid operation, but it works, I very wonder it, why why why???
 
    