Classes and class hierarchies
C.46
По умолчанию объявляйте конструкторы с одним аргументом явными
Причина
Чтобы избежать непреднамеренных преобразований.
Плохой пример
class String {
public:
String(int); // BAD
// ...
};
String s = 10; // surprise: string of size 10
Исключение
Если вы действительно хотите неявное преобразование из типа аргумента конструктора в тип класса, не используйте explicit:
class Complex {
public:
Complex(double d); // OK: we want a conversion from d to {d, 0}
// ...
};
Complex z = 10.7; // unsurprising conversion
См. также: Обсуждение неявных преобразований
Примечание
Конструкторы копирования и перемещения не должны быть сделаны explicit, потому что они не выполняют преобразования. Явные конструкторы копирования/перемещения затрудняют передачу и возврат по значению.
Применение
(Simple) Конструкторы с одним аргументом должны быть объявлены explicit. Хорошие конструкторы с одним аргументом без explicit редки в большинстве баз кода. Предупредите все, которые не находятся в "положительном списке".