2016-05-13 10 views
2

Ich habe eine Klasse, in der die Bewegungszuweisung explizit gelöscht wird, da das Objekt nicht beweglich sein soll. Aber wenn ich auf eine Instanz dieser Klasse zuweisen mit RVO der Compiler gibt mir den Fehler:Compiler verwendet keine Kopierzuweisung statt verschieben?

main.cpp:12:16: note: candidate function has been explicitly deleted 

auch der Compiler die vorhandene Kopie Zuweisungsoperator ist zu erwähnen, aber nicht verwendet es nicht.

hier ist mein Code (oder ein (nicht) läuft Beispiel here):

class foo { 
public: 
    foo() {} 
    foo(foo const& r) {} 
    foo(foo&&) = delete; 

    foo const& operator=(foo const& r) { return *this; } 
    foo const& operator=(foo&& r) = delete; 
}; 

int main(int argc, char **argv) { 
    foo bar; 
    bar = foo(); 
    return 0; 
} 

fand ich eine ganz ähnliche Position here.

Ich weiß, ich kann dies vermeiden, indem Sie eine temporäre verwenden. Ich frage mich, warum jeder Compiler (ich testete dies mit gcc, clang und vs2013) nicht in der Lage ist, die bestehende Kopie Zuordnung direkt aufzurufen? Gibt es etwas, das mir fehlt?

+4

Der Umzug Zuweisungsoperator ist ein besseres Spiel. Das passiert, bevor man bedenkt, dass es gelöscht wird. – chris

+4

gelöschte Funktionen nehmen an der Überlastungsauflösung teil. – 101010

+0

Löschen Sie einfach nicht die Bewegung Assingment und alles wird gut. Das Vorhandensein von Nicht-Bewegung 1 wird den Standard verhindern. – SergeyA

Antwort

2

Die Kopierzuweisung wird nicht aufgerufen, da die Zuweisungszuweisung (gelöscht) besser zur Überladungsauflösung passt.

Einfach die Bewegungszuweisung überhaupt nicht deklarieren. Dann wird die Kopierzuweisung ausgewählt. Der implizite Zuweisungsoperator wird nicht generiert, da für die Klasse ein Benutzer einen Kopierkonstruktor, einen Bewegungskonstruktor und einen Kopierzuweisungsoperator deklariert hat. Irgendwelche von diesen verhindern die Erzeugung des impliziten Bewegungszuweisungsoperators.


But if i assign to an instance of this class using RVO

Es gibt keine RVO hier beteiligt. Sie erstellen ein temporäres foo und kopieren es einer vorhandenen Variablen zu. Kopieraufträge können nicht gelöscht werden.

Es ist auch ziemlich ungewöhnlich und ineffizient, nach Wert von einem Zuweisungsoperator zurückzugeben.

+0

' Auch ist es ziemlich ungewöhnlich und ineffizient, nach Wert von einem Zuweisungsoperator zurückzugeben. "Das ist wahr und auch der Kommentar von erip (' Firma mag langsameren Code.'). Ich arbeitete an einer Klasse, die nicht von mir entworfen wurde, und fragte mich nur, warum es passiert ... – user1810087

0

könnten Sie Platzierung neu, dies zu tun:

#include <iostream> 
#include <string> 
#include <new> 

class foo { 
public: 

    foo() {} 
    foo(foo const& r) {} 
    foo(foo&&) = delete; 

    foo const& operator=(foo const& r) { return *this; } 
    foo const& operator=(foo&& r) = delete; 
}; 

int main(int argc,char **argv) 
{ 
    foo bar; 

    //bar = foo(); 
    bar.~foo(); 
    new(&bar) foo(); 

    return 0; 
} 
Verwandte Themen