Плохо ли использовать конструктор приведения? В противном случае, почему средство проверки качества кода (в моем случае cppcheck) постоянно предлагало бы добавить явное значение перед конструкторами с одним параметром?
Что, если я хочу сделать
class MyClass {
A(int) {}
};
A a = 1;
Если я последую "предложениям" и напишу
class MyClass {
explicit A(int) {}
};
A a = 1;
вызовет ошибку, но если я воспользуюсь первым, у меня будет предупреждение, что я должен задокументировать, чтобы пройти проверку кода.
Прямое решение — инициализировать с помощью A a{1};
Вы можете отключить проверку локально, см., например, cppcheck-inline-suppression.
См. также: Стоит ли массово вводить явное ключевое слово?
C.46: по умолчанию объявлять конструкторы с одним аргументом явным
Причина
Чтобы избежать непреднамеренных преобразований.
Пример, плохо
class String { public: String(int); // BAD // ... }; String s = 10; // surprise: string of size 10
Исключение
Если вы действительно хотите неявное преобразование из конструктора тип аргумента к типу класса, не используйте явный:
class Complex { public: Complex(double d); // OK: we want a conversion from d to {d, 0} // ... }; Complex z = 10.7; // unsurprising conversion
Смотрите также: Обсуждение неявных преобразований
Такое неявное преобразование типа класса можно легко использовать без намерения. С этим конструктором преобразования каждая функция или функция-член, которая принимает MyClass
в качестве аргумента, также будет принимать int
. Поэтому каждый int
, переданный такой функции, будет преобразован во временный MyClass
, который будет отброшен после завершения функции. Вероятно, это не то, что вы хотите.
Такие программы проверки, как cppcheck, проверяют соответствие правилам стиля. Некоторые рекомендации по стилю не рекомендуют использовать конструкторы «приведения» с одним аргументом и рекомендуют делать их явными, поскольку это позволяет избежать непреднамеренных неявных преобразований. Смысл таких рекомендаций по стилю требует, чтобы вы документировали явное обоснование использования конструкторов неявного приведения всякий раз, когда вы их используете.