Предупреждение компилятора, когда класс нарушает правило трех (пяти)

Можно ли вызвать предупреждение компилятора, когда класс нарушает правило трех (или правило пяти)?

Эта функция кажется простой в реализации и очень полезна в критически важном для безопасности программном обеспечении, но я не могу найти ее нигде в документации или результатах поиска Google.


person JD.    schedule 07.12.2016    source источник
comment
Это может быть идеалистическая чепуха, но ИМХО гораздо лучше строить свои классы таким образом, чтобы вам никогда не приходилось реализовывать функции, необходимые для правила трех или правила пяти.   -  person Bathsheba    schedule 07.12.2016
comment
@Вирсавия абсолютно согласна. Если вы не используете правило нуля, ваш код недостаточно разложен.   -  person Richard Hodges    schedule 07.12.2016
comment
Я лично не хотел бы проверять Правило пяти, так как не уверен, что это хорошее руководство. Пожалуйста, проверьте это обсуждение Говарда Хиннанта: stackoverflow.com/a/38687106/1989995   -  person alexeykuzmin0    schedule 07.12.2016
comment
Правило нуля — это хорошо, но оно работает только потому, что люди следуют правилу пяти в других местах. В конце концов кто-то должен реализовать специальные функции-члены.   -  person Ryan Haining    schedule 29.04.2019


Ответы (3)


Вы можете использовать флаг компилятора -Weffc++ для ССЗ

person Swapnil    schedule 07.12.2016
comment
-Weffc++ находит некоторые интересные проблемы, но не находит нарушений правила пяти. Я использую текущий gcc из ветки gcc-8. Ни ток не лязгает. - person proski; 02.05.2018
comment
прикомандирован. -Weffc++ не улавливает это - person Ryan Haining; 16.05.2018

Visual Studio 2017 RC указывает на наличие некоторых "Проверок для принудительного основные принципы C++». Поскольку «Правило пяти» является одним из наиболее легко проверяемых правил, я считаю, что оно выполняется.

person alexeykuzmin0    schedule 07.12.2016

clang-tidy может выявить такие ошибки. Учитывая этот файл:

// badstyle.cpp
class Type {
  Type(const Type&) { }

  ~Type() { }
};

И эта команда:

$ clang-tidy badstyle.cpp -checks=cppcoreguidelines-*

Мой вывод:

badstyle.cpp:2:7: warning: class 'Type' defines a non-default destructor and a 
copy constructor but does not define a copy assignment operator, a move constructor
or a move assignment operator [cppcoreguidelines-special-member-functions]
class Type {
  ^
person Ryan Haining    schedule 16.05.2018