Если вы не пишете конструктор перемещения или оператор присваивания перемещения, конструктор копирования всегда определяется (возможно, как удаленный или неопределенный до C ++ 11). Если вы не объявите это самостоятельно, оно генерируется автоматически.
Теперь, я не знаю достаточно о MISRA, чтобы быть уверенным в обосновании упомянутого вами правила, поэтому я собираюсь догадаться, что это такое. Если у вас есть конструктор шаблона с одним и общим параметром, то вы можете делать больше, чем простую копию, и вы можете ошибочно думать, что все конструкции копирования будут выполняться через этот конструктор шаблона. Но если вы копируете-конструируете объект этого класса (объект с конструктором шаблона) с другим объектом того же класса или с его производным, тогда автоматически сгенерированный конструктор копирования будет называться , и ни один из дополнительная работа, которую должна выполнять версия шаблона.
Короче говоря, предоставляя конструктор копирования, даже когда он предоставляет конструктор шаблона с единственным и универсальным параметром, вы гарантируете, что конструкции копирования всегда работают, как предполагалось. Более того, вы явно показываете потенциальным пользователям класса, что у него есть надлежащий конструктор копирования в дополнение к конструктору шаблона.