Как уже отмечали другие, здесь у вас есть инициализация копирования, поэтому нет способа использовать конструктор по умолчанию.
Существует немного другой случай, когда инициализация копирования может (по крайней мере, теоретически) включать дополнительный шаг. Рассмотрим код, подобный следующему:
class foo {
public:
foo(int) {}
};
int main() {
foo f = 1;
}
В этом случае (по крайней мере, до C ++ 17) теоретически предполагалось участие двух отдельных конструкторов. Сначала был создан временный объект, инициализированный 1
, затем был вызван конструктор копирования для инициализации f
из этого временного объекта.
В этом случае большинство компиляторов будут генерировать код, который непосредственно инициализирует f
из q
, так что это эквивалентно foo f{1};
. Тем не менее, компилятор должен учитывать тот факт, что требуется копия, поэтому, если вы удалите конструктор копирования, компиляция завершится неудачно:
class foo {
foo(foo const &)= delete;
public:
foo(int) {}
};
int main() {
foo f = 1;
}
Результат (с g cc):
trash9.cpp: In function 'int main()':
trash9.cpp:8:17: error: use of deleted function 'foo::foo(const foo&)'
foo f = 1;
^
trash9.cpp:2:9: note: declared here
foo(foo const &) = delete;
^~~
trash9.cpp:4:9: note: after user-defined conversion: 'foo::foo(int)'
foo(int) {}
^~~
Но изменения в правилах, начиная с C ++ 17, означают, что теперь даже это разрешено (поэтому, если я добавлю -std=c++17
к приведенной выше компиляции, это будет успешно).