Я считаю, что в D есть несколько мест (например, возвращающих структуры), в которых D удается заставить их двигаться, тогда как C ++ сделает их копию. IIRC, компилятор будет делать перемещение, а не копирование в любом случае, когда он может определить, что копия не нужна, поэтому структурное копирование в D будет происходить реже, чем в C ++. И, конечно, поскольку классы являются ссылками, у них вообще нет проблем.
Но независимо от того, конструкция копирования уже работает в D иначе, чем в C ++. Как правило, вместо объявления конструктора копирования вы объявляете конструктор postblit: this(this)
. Он выполняет полную memcpy до вызова this(this)
, и вы вносите только те изменения, которые необходимы, чтобы новая структура была отделена от оригинала (например, делала глубокую копию переменных-членов, где это необходимо), в отличие от создания совершенно новый конструктор, который должен копировать все Итак, общий подход уже немного отличается от C ++. Также общепризнанно, что структуры не должны иметь дорогих конструкторов с постблитом - копирование структур должно быть дешевым, так что это не такая большая проблема, как в C ++. Объекты, которые будут дорогостоящими для копирования, обычно являются либо классами, либо структурами со ссылкой или семантикой COW.
Контейнеры, как правило, являются ссылочными типами (в Фобосе они являются структурами, а не классами, так как им не нужен полиморфизм, но их копирование не копирует их содержимое, поэтому они все еще являются ссылочными типами), поэтому копируйте их не дорого, как это было бы в C ++.
В D вполне могут быть случаи, когда он мог бы использовать нечто похожее на конструктор перемещения, но в целом D был спроектирован таким образом, чтобы уменьшить проблемы, возникающие в C ++ при копировании объектов вокруг, так что это ни к чему рядом с проблемой, что это в C ++.