Я пытаюсь реализовать конструктор перемещения для объекта A, который использует идентификатор класса. Идентификатор класса автоматически генерируется, и для будущего здравого смысла кодирования я решил удалить конструктор по умолчанию, когда я это сделаю.C++ Почему я не могу использовать swap для объекта с удаленным конструктором по умолчанию
Однако, когда я пытаюсь использовать swap в конструкторе перемещения A, он жалуется, что конструктор по умолчанию id удаляется. Я думал, что swap не создает никаких новых объектов, а просто заменяет адреса этих двух элементов.
Я не понял его и на самом деле создает третий временный экземпляр Id ??
Если это так, то каков наилучший способ реализовать конструктор перемещения ниже?
Я включил минимальный пример ниже:
class Id {
public:
Id() = delete;
Id(std::string id) : m_id(id) {}
private:
std::string m_id;
};
class A {
public:
A() = delete;
A(Id id) : m_id(id) {}
A(A&& other) {
std::swap(m_id, other.m_id);
}
private:
Id m_id;
};
компилятор возвращает следующую ошибку:
In constructor 'A::A(A&&)':
21:18: error: use of deleted function 'Id::Id()'
8:5: note: declared here
In file included from /usr/include/c++/4.9/bits/stl_pair.h:59:0,
from /usr/include/c++/4.9/bits/stl_algobase.h:64,
from /usr/include/c++/4.9/bits/char_traits.h:39,
from /usr/include/c++/4.9/ios:40,
from /usr/include/c++/4.9/ostream:38,
from /usr/include/c++/4.9/iostream:39,
from 2:
/usr/include/c++/4.9/bits/move.h: In instantiation of 'void std::swap(_Tp&, _Tp&) [with _Tp = A]':
34:17: required from here
/usr/include/c++/4.9/bits/move.h:176:11: error: use of deleted function 'A& A::operator=(const A&)'
__a = _GLIBCXX_MOVE(__b);
^
15:7: note: 'A& A::operator=(const A&)' is implicitly declared as deleted because 'A' declares a move constructor or move assignment operator
In file included from /usr/include/c++/4.9/bits/stl_pair.h:59:0,
from /usr/include/c++/4.9/bits/stl_algobase.h:64,
from /usr/include/c++/4.9/bits/char_traits.h:39,
from /usr/include/c++/4.9/ios:40,
from /usr/include/c++/4.9/ostream:38,
from /usr/include/c++/4.9/iostream:39,
from 2:
/usr/include/c++/4.9/bits/move.h:177:11: error: use of deleted function 'A& A::operator=(const A&)'
__b = _GLIBCXX_MOVE(__tmp);
Как SWAP сделать свою работу за один шаг? –