Nach ein wenig Forschung, sehe ich, dass C++11 has a defect mit Allokatoren, die den Typ erfordern, beweglich/kopierbar sein. Ich bin mir sicher, dass dies die Ursache dieses Problems ist, aber ich bin verwirrt über das Verhalten zwischen gelöschter und nicht deklarierter Verschiebungssemantik.Warum verursacht gelöschte move-Semantik Probleme mit std :: vector?
Ich habe den folgenden Code, der auf beiden MSVC12 und Clang kompiliert fehlschlägt:
xmemory0(600): error C2280: 'Copyable::Copyable(Copyable &&)' : attempting to reference a deleted function
Und auf Clang (live sample):
#include <vector>
class Copyable
{
public:
Copyable() = default;
Copyable(Copyable const& other)
: m_int(other.m_int)
{}
Copyable& operator= (Copyable const& other)
{
m_int = other.m_int;
return *this;
}
Copyable(Copyable&&) = delete;
Copyable& operator= (Copyable&&) = delete;
private:
int m_int = 100;
};
int main()
{
std::vector<Copyable> objects;
objects.push_back(Copyable{});
}
mit diesem nicht kompilieren auf MSVC
In beiden Fällen, wenn ich das explizit gelöschte Move Construct/Assign entfernen Methoden kompiliert der Code. AFAIK, wenn Sie Methoden zum Zuweisen/Konstruieren von Kopien deklarieren, deklariert der Compiler die entsprechenden Verschiebeelemente nicht implizit. Also sollten sie trotzdem effektiv gelöscht werden, oder? Warum kompiliert der Code, wenn ich das explizite Löschen von move construct/assign entferne?
Was ist eine gute Problemumgehung für diesen C++ 11 Defekt im Allgemeinen? Ich möchte nicht, dass meine Objekte beweglich sind (aber sie sind kopierbar).
Implementierung über eine Kopie implementieren? –
Auch bezogen auf: [Warum partizipieren C++ 11-gelöschte Funktionen an der Überladungsauflösung?] (Http: // stackoverflow.com/questions/14085620/why-do-c11-deleted-functions-partition-in-overload-resolution) – Nawaz