Мелкая копия не является чем-то особенным, что вам нужно запомнить, как правило.Вместо этого это просто то, что происходит в результате использования ссылки или указателя.Рассмотрите этот пример:
struct foo {
int* x;
};
int a = 4;
foo f{&a};
Здесь x
указывает на a
, и если вы скопируете f
, новые экземпляры x
будут указывать на тот же a
.Это мелкая копия.Глубокая копия должна учитывать, что не только x
, но и то, на что указывает x
, является неотъемлемой частью foo
и его также необходимо скопировать.В общем, компилятор не может решить, что вы хотите.Является ли x
просто ссылкой или то, что x
также относится к части foo
?Следовательно, то, что вы получаете, является очевидным: копируются только участники, а не то, к чему они могут обращаться.
Теперь, если вы скопируете foo
, а затем измените значение, на которое указывает x
, это изменит то же самое a
.Мелкая копия была сделана.По моему опыту, термины «глубокая и мелкая копия» скорее добавляют путаницу, чем ясность.То, что вы получаете бесплатно, - это копирование всех участников (мелкая или глубокая копия).Только если вам нужно больше (копируйте также умышленно), вам нужно беспокоиться о мелких и глубоких копиях.
TL; DR: в вашем примере нет глубокой / мелкой копии.Для ценностей это различие не имеет смысла.Используйте int*
, чтобы увидеть эффект.