Почему нам нужно сделать конструктор явным, если он не требует ввода?
Это кажется мне неправильным. Конструктор должен быть явным, если вы не хотите, чтобы конструктор вызывался автоматически.
Скажем, у вас есть:
struct Foo
{
Foo() {}
Foo(int) {}
};
void bar(Foo)
{
}
Тогда
bar(1);
будет работать. Это переводится как:
bar(Foo(1));
Если есть конструктор по умолчанию, то есть тот, который не принимает никаких аргументов, преобразовать не из чего. Вы не можете использовать:
bar();
и надеюсь перевести его как:
bar(Foo{});
Какая польза от создания конструктора как явного, если он принимает более одного параметра и все параметры не являются параметрами по умолчанию?
Этот имеет некоторую законность.
Если у вас было:
struct Foo
{
Foo() {}
Foo(int, int) {}
};
void bar(Foo)
{
}
Вы не можете использовать
bar(10, 20);
или
bar((10, 20));
и надеюсь перевести его как:
bar(Foo(10, 20));
Однако вы можете использовать:
bar({10, 20});
и будет переведено как:
bar(Foo{10, 20});
Если вы хотите запретить использование этого синтаксиса, bar({10, 20})
, вы можете сделать конструктор explicit
. ИМО, в этом меньше полезности. Возможность непреднамеренного неправильного использования конструктора с одним аргументом реальна. Возможность непреднамеренного неправильного использования конструктора с более чем одним аргументом очень мала.