Конструкторы по умолчанию не должны иметь никаких параметров; они просто должны быть доступны без аргументов.
Это условие выполняется любым конструктором, все аргументы которого имеют значения по умолчанию.
[class.dtor/1]:
Конструктор по умолчанию Класс X - это конструктор класса X, для которого каждый параметр, который не является пакетом параметров функции, имеет аргумент по умолчанию (включая случай конструктора без параметров). [..]
struct Foo
{
Foo(int a = 0);
Foo(std::string str = "");
};
Теперь, конечно, в этом примере вы не можете на самом деле создать экземпляр Foo
, используя любой из них без предоставления аргумента (вызов будет быть неоднозначным). Но Foo
все еще можно использовать, и это все еще «конструкторы по умолчанию». Именно так стандарт решил классифицировать вещи с целью определения правил. Это на самом деле не влияет на ваш код или программирование.
(Кстати, я не хотел отвлекать, но вы должны иметь explicit
на обоих!)