2016-11-04 4 views
0

dieses minimal Beispiel vor:Wertersatz ohne den Zuweisungsoperator

#include <iostream> 

using namespace std; 

class A 
{ 
public: 
    A() { cout << "Making A" << endl; } 
    A& operator=(const A& other) = delete; 
}; 


int 
main(int argc, char* argv[]) 
{ 
    A a; 
    a = A(); 

    return 0; 
} 

compilieren gibt die folgenden Fehler:

$ g++ -std=c++11 -Wall test.cc -o test && ./test 
test.cc: In function ‘int main(int, char**)’: 
test.cc:17:7: error: use of deleted function ‘A& A::operator=(const A&)’ 
    a = A(); 
    ^
test.cc:9:8: error: declared here 
    A& operator=(const A& other) = delete; 
     ^

Ich will „Reset“ den Wert von a zu einem neu errichteten A . Gibt es eine Möglichkeit für mich, nur den Konstruktor zu verwenden? Das heißt, ohne den Zuweisungsoperator zu verwenden, der in meinem Real-World-Code gelöscht werden muss? Ich habe zum Beispiel versucht, std::move a la a = std::move(A()); zu verwenden, aber das gibt den gleichen Fehler.

+0

Können Sie nicht 'A & operator = (A &&) = default;'? – Jarod42

+0

Warum müssen Sie den Zuweisungsoperator löschen? Das ist eine ziemlich merkwürdige Anforderung. –

+0

@NirFriedman In meinem Code 'operator =' ist implizit gelöscht und es ist nicht einfach für mich, es hinzuzufügen. – firebush

Antwort

4

Sie können den Konstruktor nur einmal für ein Objekt aufrufen. Danach ist das Objekt bereits konstruiert und kann nicht ein zweites Mal konstruiert werden.

können Sie das Objekt zerstören und es an Ort und Stelle rekonstruieren:

a.~A(); 
::new (&a) A(); 

Wenn Sie sich diese benötigen findet oft zu tun, ist es besser, nur ein .clear() Mitglied oder etwas ähnliches bieten ... oder vielleicht einfach nicht Löschen Sie den Zuweisungsoperator. Sie haben nicht genügend Details angegeben.

+0

Das beantwortet meine Frage. Ein Löschen ist für mich keine Option, da ich von einer Klasse, die in einer Drittanbieterbibliothek definiert ist, erben, und ich habe keinen Mechanismus, um es ordnungsgemäß zu löschen. Gibt es mehr Informationen, die Sie brauchen? – firebush

Verwandte Themen