Здесь обсуждается пара различных концепций.CopyConstructible
требует только того, чтобы вы могли создать новый элемент этого типа, используя существующий элемент в качестве источника для копирования.Он не имеет отношения к deep или shallow или даже эквивалентности : контейнеру все равно, что вы делаете во время копирования, если ему разрешено выполнять эту копию.
Вторым понятием является понятие эквивалентность , когда вы используете объект в контейнере, он будет скопирован, а количество выполненных копий неизвестно - реализация может скопировать еготолько один раз, чтобы сохранить его внутри, или он может сделать несколько копий внутри.То, что вы хотите, - это возможность извлечь элемент из контейнера и использовать его, как если бы он был исходным объектом, вот где приходит эквивалентность : n-я копия, котораяВы извлекаете , должно быть эквивалентным вставленному вами объекту.
Понятия deep и shallow непосредственно связаны с эквивалентность , в зависимости от моделируемого домена, эквивалентность может потребовать либо мелкое , либо глубокое копирование, и в зависимости от других ограничений вам может потребоваться выбрать одно или другое -- если в вашем домене они эквивалентны - или могут быть даже промежуточные варианты, когда выполняется частично глубокое копирование, или некоторые элементы вообще не копируются.