I_love_natalia's blog

By I_love_natalia, 12 years ago, In Russian

Вот укороченная версия примера, на который я натолкнулся сегодня:

#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;
}
  • Vote: I like it
  • +32
  • Vote: I do not like it