4

Я пытаюсь реализовать конструктор перемещения для объекта 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); 
+0

Как SWAP сделать свою работу за один шаг? –

ответ

6

Вы можете использовать swap на Id объектов, проблема не существует , но в конструкторе A.

A(A&& other) { 
    std::swap(m_id, other.m_id); 
} 

Это по умолчанию построения Id, а затем обменивать его с членом другой A.

Чтобы избежать конструктор по умолчанию, вы должны инициализировать Id в списке инициализатора

A(A&& other) : m_id(std::move(other.m_id)) 
{ } 
Смежные вопросы