Когда объявлять конструкторы с несколькими параметрами explicit?
В каких случаях стоит объявлять конструкторы с несколькими параметрами explicit?
В большинстве кода и гайдах, что я видел, только конструкторы с 1 параметром по умолчанию объявляют explicit, однако Google рекомендует объявлять explicit любые конструкторы, параметры которых не представляют значения класса. Например, конструкторы классов-контейнеров, принимающие итераторы на начало и конец какой-то последовательности, из которой необходимо заполнить контейнер. Это позволит избежать ошибок вида std::vector<char> v = {"hello", "world"};.
Ответы (1 шт):
Например всем знакомым std::ifstream имеет такой конструктор:
explicit basic_ifstream(
const char*, ios_base::openmode, int)
Не трудно догадаться почему конструктор сделан явным _ лишить возможности инициализировать универсальным инициализатором, не то получать проблем и неразберихи не сложно(еще один пример есть в вашем вопросе).
В каких случаях стоит объявлять конструкторы с несколькими параметрами explicit?
До появления универсального инициализатора не нужно было, но теперь:
всегда, кроме случаев, когда неявное преобразование семантически оправдано.