Недавно я заметил класс в С++ 0x, который вызывает явный конструктор по умолчанию. Однако я не могу придумать сценарий, в котором конструктор по умолчанию можно назвать неявным. Это кажется довольно бессмысленным спецификатором. Я подумал, что, возможно, это отклонит Class c;
в пользу Class c = Class();
, но это, похоже, не так.
Некоторые релевантные цитаты из С++ 0x FCD, так как мне легче перемещаться [аналогичный текст существует в С++ 03, если не в тех же местах]
12.3.1.3 [class.conv.ctor]
Конструктор по умолчанию может быть явным конструктором; такой конструктор будет использоваться для выполнения инициализации по умолчанию или инициализации значения (8.5).
Далее приводится пример явного конструктора по умолчанию, но он просто имитирует приведенный выше пример.
8.5.6 [decl.init]
Для инициализации объекта типа T по умолчанию:
- если T является классом класса (возможно, cv-qualit) (раздел 9), вызывается конструктор по умолчанию для T (и инициализация плохо сформирована, если T не имеет доступного конструктора по умолчанию);
8.5.7 [decl.init]
Для инициализации объекта типа типа T означает:
- если T является классом класса (возможно, cv-qualit) (раздел 9) с предоставленным пользователем конструктором (12.1), тогда вызывается конструктор по умолчанию для T (и инициализация плохо сформирована, если T не имеет доступный конструктор по умолчанию);
В обоих случаях стандартный вызов вызывает конструктор по умолчанию. Но это произойдет, если конструктор по умолчанию был не явным. Для полноты:
8.5.11 [decl.init]
Если для объекта не задан инициализатор, объект инициализируется по умолчанию:
Из того, что я могу сказать, это просто исключает преобразование из данных. Это не имеет смысла. Лучшее, что я могу придумать, будет следующим:
void function(Class c);
int main() {
function(); //implicitly convert from no parameter to a single parameter
}
Но, очевидно, это не так, как С++ обрабатывает аргументы по умолчанию. Что еще может сделать explicit Class();
вести себя иначе, чем Class();
?
Конкретный пример, сгенерировавший этот вопрос, был std::function
[20.8.14.2 func.wrap.func]. Он требует нескольких конструкторов преобразования, ни один из которых не помечен как явный, но конструктор по умолчанию.