vector<vector<string> > test
например.
G ++, вы можете сделать
test.reserve(10);
test[0] = othervector;
test[9] = othervector;
Не падает. Теория говорит, что вы не должны делать это так, потому что вы назначаете вектор для фрагмента памяти, который считает , это вектор.
Но это работает так же, как следующий:
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<string> first_vector;
vector<string> &second_vector = *(vector<string>*)new char[sizeof(vector<string>)];
first_vector.push_back("whatever");
first_vector.push_back("whatever2");
first_vector.push_back("whatever3");
second_vector = first_vector;
cout << "0 " << second_vector[0] << " \n";
cout << "1 " << second_vector[1] << " \n";
cout << "2 " << second_vector[2] << " \n";
}
Мне кажется, что оператор присваивания вектора фактически копирует все или, по крайней мере, достаточно полей векторной реализации, чтобы это работало, предоставляя совершенно правильный вектор в неинициализированном.
Что ж, для меня это явно неопределенное поведение, единственная проблема в том, что он работает как положено, я нашел довольно много из них в кодовой базе, которую я сейчас проверяю.
Есть ли еще случаи, подобные этому, в остальных контейнерах? Никогда не видел такого, который кажется таким простым, чтобы совершить ошибку, но он действительно работает, даже если вы допустили ошибку.
РЕДАКТИРОВАТЬ : Речь идет не о том, как правильно выполнить вышеизложенное, или о жалобах на поведение компиляторов, о попытках найти похожие проблемы, которые легко могут возникнуть, и которые действительно трудно обнаружить позже, например, эту. *