Почему дефолт-перемещение-ctor запрещает неявный-копирование-ctor, а не дефолт-копирование-ctor?

Кажется, я сталкивался с примером, в котором конструктор перемещения по умолчанию, кажется, считается как объявленным пользователем, так и не пользователем, в зависимости от ситуации:

struct Foo {
int a;
Foo():a(42){};
//Foo(const Foo & other) = default;
Foo(Foo && other) = default;

};

int main() {
Foo f;
Foo g = f;
}

Результаты в этом:

test.cpp:11:9: error: call to implicitly-deleted copy constructor of 'Foo'
Foo g = f;
^   ~
test.cpp:5:5: note: copy constructor is implicitly deleted because 'Foo' has a user-declared move constructor
Foo(Foo && other) = default;
^

Ожидается ошибка компилятора, так как cppreference говорит нам об этом:

Неявно объявленный или дефолтный конструктор копирования для класса T
определяется как удаленный, если выполняется любое из следующих условий:
[…] T имеет пользовательский конструктор перемещения или оператор присваивания перемещения;

Обратите внимание, что конструктор по умолчанию здесь считается «объявленным пользователем».
Однако, если мы теперь удалим комментарии из строки 4, тем самым явным образом по умолчанию установив конструктор копирования, программа скомпилируется без ошибок, даже если в приведенном выше утверждении указано:

Неявно объявленный или дефолт конструктор копирования

Это похоже на противоречие. Это ошибка в cppreference или я просто запутался?

1

Решение

Это похоже на ошибку со стороны cppreference. Объявление конструктора перемещения / оператора присваивания удаляет только косвенным образом объявленный экземпляр конструктора. Действительно, объявление конструктора копирования по умолчанию является объявлением пользователя, и это не относится к этому случаю.

2

Другие решения

Почему дефолт-перемещение-ctor запрещает неявный-копирование-ctor, а не дефолт-копирование-ctor?

Потому что, когда вы определяете конструктор как дефолтный, вы восстанавливаете эффект удаления, вызванный конструктором перемещения, дефолтный конструктор копирования имеет тот же эффект, что и явное определение его действия, которое будет делать компилятор.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector