Ну, явные конструкторы всегда безопасны, но могут быть неудобны. explicit
гарантирует ошибку компиляции, если вы предоставите StrategyInterface*
, где ожидается Context
. При этом он предотвращает строительство временного Context
. Это становится особенно важным в определенных обстоятельствах, например:
Context
вступает во владение указанным StrategyInterface
и удаляет его в деструкторе
Context
Строительство / разрушение выполняет другие дорогостоящие или неуместные действия
- он однозначно устраняет неоднозначность некоторых операций и делает другие неоднозначными, тогда как программист мог бы подумать, как устранить неоднозначность (например, попытка сравнить
Context
и StrategyInterface*
приведет к компиляции ошибка времени, результат сравнения StrategyInterface*
с, StrategyInterface
с или Context
с?)
Если Context
практически является заменой для StrategyInterface
, просто с некоторыми незначительными регистрациями или другими улучшениями, тогда может быть целесообразно разрешить неявное построение, так же как std::string
может быть построено из const char*
. Когда они явно независимы или когда время существования Context
должно существовать вне любого данного использования StrategyInterface
, тогда указывается явный конструктор.
(Примечание: эти рекомендации довольно грубые - скорее отправная точка, чем конец - комментарии приветствуются)