Кажется, я столкнулся с примером, в котором конструктор перемещения по умолчанию, кажется, считается как объявленным пользователем, так и объявленным не пользователем, в зависимости от ситуации:
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 или я просто запутался?