Я создал собственный класс и следовал (насколько мне известно) правилу трех, описанному в этом посте: https://stackoverflow.com/a/51864979/2184449 У меня есть собственное определение для MyClass::~MyClass, MyClass::operator=(MyClass mc) и MyClass::MyClass(MyClass &mc).
Однако, когда я создаю vector экземпляров MyClass и пытаюсь emplace_back() создать экземпляр MyClass, я получаю эту ошибку:
В шаблоне: статическое утверждение не удалось из-за требования «__is_cpp17_move_insertablestd::allocator<MyClass, void>::value»: указанный тип не соответствует требованиям Cpp17MoveInsertable
Как мне сделать так, чтобы мой класс соответствовал требованиям Cpp17MoveInsertable?
Не описывайте код; покажи это. Опубликуйте самый маленький пример, который вы можете придумать, который показывает проблему.





Cpp17MoveInsertable требует, чтобы объект можно было построить из ссылки rvalue. Упрощенный пример такого кода:
MyClass obj1;
MyClass obj2{std::move(obj1)}; // this line needs to compile
// std::move is a cast to an rvalue reference
Это вызывает конструктор со следующим объявлением: конструктор перемещения
MyClass(MyClass&& other); // move constructor
// add noexcept so vector can use it when resizing
в качестве альтернативы ссылки const lvalue могут быть привязаны к ссылкам rvalue, поэтому в качестве альтернативы можно вызвать конструктор копирования, если конструктор перемещения недоступен.
MyClass(const MyClass& other); // copy constructor
Ваш конструктор, который принимает неконстантную ссылку lvalue MyClass(MyClass&), не может быть вызван со ссылкой rvalue, поэтому приведенный выше код не будет компилироваться и предотвращает генерацию конструкторов копирования/перемещения, предоставляемых компилятором, на самом деле такой конструктор не делает даже не работает для следующего кода.
const MyClass obj1;
MyClass obj2{obj1}; // error requires non-const lvalue reference
Синтаксис объявления конструкторов копирования и перемещения должен быть идентичен тем, которые имеют «правильные» конструкторы перемещения и копирования, с добавлением noexcept, когда это возможно.
В 99% случаев вам следует стараться соблюдать правило нуля, которое заключается в том, чтобы не определять какие-либо деструкторы или операции копирования/перемещения, или вам нужно =default их делать в случае виртуального деструктора для полиморфных классов.
Вы посмотрели требования для Cpp17MoveInsertable?