Нужны ли нам explicit
в этом случае:
class A
{
explicit A(B* b);
};
Я думаю, что даже если мы не пометим конструктор как explicit
, это будет ошибка компиляции, чтобы написать:
A a = new B();
Неявное преобразование из указателя на объект вообще невозможно с помощью конструктора, верно?
Конвертировать не удастся из B*
в A
,
Это именно то, что явное предотвратит.
Вы должны просто написать A a( new B() );
в этом случае или если вы хотите быть реальным многословным, вы могли бы написать A a = A( new B() );
Что касается основного вопроса: вам это нужно или нет, это зависит от вас и вашей команды. Как правило, главный вопрос: есть ли у вас когда-нибудь конструктор ‘int’ (приведет к противоречивости с * типами), что вы хотите, и хотите ли вы, чтобы неявные преобразования происходили из аргументов конструкции или нет.
Вы делать нужен explicit
если вы не хотите, чтобы этот конструктор использовался для неявных преобразований. Вполне возможно иметь неявное преобразование на основе конструктора, принимающее указатель.
Нужно ли явно для CTOR с указателем типа?
Это зависит от вас и вашей команды, если вы работаете в команде. Это скорее руководство по кодированию, чем что-либо еще. Язык не обязывает это.