Почему у меня должен быть конструктор копирования, если есть конструктор шаблона с единственным параметром, который является универсальным?

Правило MISRA 14-5-2 гласит:

Конструктор копирования должен быть объявлен, когда существует конструктор шаблона с единственным параметром, который является универсальным параметром.

Я не могу найти ничего, что объясняет мне достаточно простыми словами, почему в таком случае должен быть конструктор копирования.

Я посмотрел на конструктор копирования класса шаблона и конструктор шаблона C++, почему вызывается конструктор копирования?, но ни один из них не помог мне. Я вижу упоминание о том, что конструктор копирования не существует, но разве не создается созданный по умолчанию конструктор? Я видел ссылки на copy elision, но я не понимаю, зачем ему нужен конструктор копирования.

Насколько я могу судить, это может подпадать под "хорошую практику программирования, за которой нужно следить"... или это может быть "вы только что вступили в неопределенную область поведения". Что я должен искать, чтобы определить, вызывает ли код, нарушающий это правило MISRA, риск в его текущей кодовой базе?

1 ответ

Решение

Если вы не пишете конструктор перемещения или оператор присваивания перемещения, конструктор копирования всегда определяется (возможно, как удаленный или неопределенный до C++11). Если вы не объявите это сами, оно генерируется автоматически.

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

Короче говоря, предоставляя конструктор копирования, даже когда он предоставляет конструктор шаблона с единственным и универсальным параметром, вы гарантируете, что конструкции копирования всегда работают так, как задумано. Более того, вы явно показываете потенциальным пользователям класса, что у него есть надлежащий конструктор копирования в дополнение к конструктору шаблона.

Другие вопросы по тегам