Почему у меня должен быть конструктор копирования, если есть конструктор шаблона с единственным параметром, который является универсальным? - PullRequest
0 голосов
/ 01 ноября 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 01 ноября 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...