Когда объявлять конструкторы с несколькими параметрами explicit?

В каких случаях стоит объявлять конструкторы с несколькими параметрами explicit?

В большинстве кода и гайдах, что я видел, только конструкторы с 1 параметром по умолчанию объявляют explicit, однако Google рекомендует объявлять explicit любые конструкторы, параметры которых не представляют значения класса. Например, конструкторы классов-контейнеров, принимающие итераторы на начало и конец какой-то последовательности, из которой необходимо заполнить контейнер. Это позволит избежать ошибок вида std::vector<char> v = {"hello", "world"};.


Ответы (1 шт):

Автор решения: AR Hovsepyan

Например всем знакомым std::ifstream имеет такой конструктор:

explicit basic_ifstream(
    const char*, ios_base::openmode, int)

Не трудно догадаться почему конструктор сделан явным _ лишить возможности инициализировать универсальным инициализатором, не то получать проблем и неразберихи не сложно(еще один пример есть в вашем вопросе).

В каких случаях стоит объявлять конструкторы с несколькими параметрами explicit?

До появления универсального инициализатора не нужно было, но теперь:

всегда, кроме случаев, когда неявное преобразование семантически оправдано.

→ Ссылка