It is valid to overload a function with all parameters optional with a function that takes no parameters. The parameterless overload is called if no arguments are passed:
import std.stdio;
void fun(int x = 0, int y = 0) {
writeln(i"fun($(x), $(y))");
}
void fun() {
writeln("fun()");
}
fun(y:42); // fun(0, 42)
fun(); // fun()
Same rules apply to class constructors:
import std.stdio;
class C {
this(int x = 0, int y = 0) {
writeln(i"C($(x), $(y))");
}
this() {
writeln("C()");
}
}
auto c1 = new C(y:42); // C(0, 42)
auto c2 = new C(); // C()
D disallows parameterless constructors for structs, and there are good reasons for this. But constructors with all parameters optional are prohibited too. This restriction doesn’t make much sense, especially now when D supports named arguments. This should be valid:
struct S {
this(int x = 0, int y = 0) {
writeln(i"S($(x), $(y))");
}
}
auto s1 = S(y:42); // S(0, 42)
auto s2 = S(); // default initialization