Вот укороченная версия примера, на который я натолкнулся сегодня:
#include <vector>
#include <cassert>
using namespace std;
struct node{
vector<node> children;
} root;
int main()
{
root.children.push_back(node());
root.children[0].children.push_back(node());
assert(root.children[0].children.size() == 1); //OK now
root = root.children[0]; //My foot is hurt! My foot is very much hurt!
assert(root.children.size() == 1); //Assertion failed!
return 0;
}
Почему так происходит? Потому, что при присваивании разрушается присваиваемый объект. Граждане, будьте бдительны!
Правильно было:
#include <vector>
#include <cassert>
using namespace std;
struct node{
vector<node> children;
} root;
int main()
{
root.children.push_back(node());
root.children[0].children.push_back(node());
assert(root.children[0].children.size() == 1); //OK now
root = node(root.children[0]); //the copy constructor overcomes the problem
assert(root.children.size() == 1); //OK now
return 0;
}