Я думаю, из соображений безопасности. Хотя то, что вы описали, разрешено (и исправлено, когда кто-то знает, что он делает), делая это, вы можете получить объект, который выглядит полным, но на самом деле он пуст.
В общем случае конструктор перемещения более полезен для использования с временными значениями, такими как:
Holder a_function(...){...}
Который затем может быть использован для строительства, как:
Holder object(a_function(...));
Или чтобы избежать переназначения / копирования большого объема данных / памяти при выполнении чего-то вроде:
Holder object(Holder(100));
Но специально для этого случая, в котором нет конструктора по умолчанию (поэтому, как правило, каждый объект должен быть заполнен после построения), имея конструктор копирования в соответствии с тем, что вы предложили (аналогично конструктору перемещения), а затем выполните:
Holder object1(100);
Holder object2(object1);
Можно было бы получить object1
, который выглядит как обычный объект, но он пуст. Следовательно, он может стать источником ошибок / с позже.
Хотя это и очевидно, я должен добавить, что не будет проблем с уничтожением объекта1. Это просто то, что, используя его в течение срока его службы, незнание его пустоты, если не установлены какие-либо безопасные средства защиты (пограничные проверки), скорее всего, приведет к незаконному доступу к памяти.