attempting to reference a deleted function
-
@manni66 sagte in attempting to reference a deleted function:
Du verletzt also die 3er/5er/0er Regel. Dann ist dein Code bisher vermutlich falsch.
ja bisher war immer nur der Konstruktor und der Destruktor implementiert
-
@manni66 sagte in attempting to reference a deleted function:
Es wurde kopiert. Wenn du move nicht ausdrücklich löscht, wird das auch weiterhin passieren.
? -> ich habe doch move gelöscht. Dann wird er also weiterhin kopieren. Kompiler sagt aber trotzdem das move verwendet wird??
Mit C++17 und den Änderungen um guaranteed copy elision sollte es eigentlich wieder übersetzen.
"guaranteed copy elision" bedeutet was und wie aktiviere ich das? Ich nutze c++ 17 in Visual Studio 2017.
-
@booster sagte in attempting to reference a deleted function:
@manni66 sagte in attempting to reference a deleted function:
Es wurde kopiert. Wenn du move nicht ausdrücklich löscht, wird das auch weiterhin passieren.
? -> ich habe doch move gelöscht. Dann wird er also weiterhin kopieren. Kompiler sagt aber trotzdem das move verwendet wird??
Du löschst den Movekonstruktor. Mach das nicht. Dann wird kopiert.
Mit C++17 und den Änderungen um guaranteed copy elision sollte es eigentlich wieder übersetzen.
"guaranteed copy elision" bedeutet was
Google?
-
@manni66 sagte in attempting to reference a deleted function:
Du löschst den Movekonstruktor. Mach das nicht. Dann wird kopiert.
Aja. Ist das eine Trotzreaktion des Kompilers?
"Ich nutze den Movekonstruktor nicht und kopiere. Wenn du aber den Movekonstruktor ausdrücklich löscht dann werde ich diesen verlangen"
-
Ja, so sind Compiler - wollen immer Recht haben und den Entwickler ärgern.
-
@booster sagte in attempting to reference a deleted function:
Aja. Ist das eine Trotzreaktion des Kompilers?
Nein. Du sagst explizit: move ist verboten. Dann versuchst du ein move. Wenn der Compiler nun sagen würde, "mach ich halt ein copy" würde er dein explizites Verbot doch umgehen.
-
@wob sagte in attempting to reference a deleted function:
Nein. Du sagst explizit: move ist verboten. Dann versuchst du ein move. Wenn der Compiler nun sagen würde, "mach ich halt ein copy" würde er dein explizites Verbot doch umgehen.
Das ist aber nicht das was manni beschreiben hat. Er meinte:
"Du löschst den Movekonstruktor. Mach das nicht. Dann wird kopiert."
-
Doch, das widerspricht sich nicht mit Manni.
Du kannst einen move-Konstruktor nicht haben, dann wird kopiert (das passiert, wenn du deinen move-Konstruktor einfach löscht). Oder du kannst einen move-Konstrukur haben und ihn explizit als verboten (=delete) markieren.
Wenn du zum Beispiel einen benutzerdefinierten Copy-Konstruktor hast, dann wird KEIN automatischer move-Konstruktor erzeugt. Dann wird einfach kopiert statt zu moven.
Wenn du aber einen move-Konstruktor deklarierst, wird der auch genommen und nicht auf copy ausgewichen. Du deklarierst einen move Konstruktor, also wird er auch genommen. Danach schaut der Compiler nach, ob er diesen auch nutzen darf. Mit =delete sagst du "nein". Also kompiliert es nicht.
-
Hi wob.
Löschen und löschen sind zwei paar Stiefel.
Also den gesamten Movekonstruktor aus dem Code löschen oder mit delete als "gelöscht" kennzeichnen.Aber dann ist der Satz doch von Manni falsch bzw. nicht ganz vollständig:
"Es wurde kopiert. Wenn du move nicht ausdrücklich löscht, wird das auch weiterhin passieren."ausdrücklich gelöscht meint hier als = delete gekennzeichnet
.... muss doch dann heißen:
"Es wurde kopiert. Wenn du move nicht ausdrücklich löscht, aber auch nicht implementierst, wird das auch weiterhin passieren."Dann hätte ich das verstanden.
-
@wob sagte in attempting to reference a deleted function:
Wenn du aber einen move-Konstruktor deklarierst, wird der auch genommen und nicht auf copy ausgewichen.
Fun fact: Ein Move-Konstruktor (oder Zuweisungsoperator) der implizit als deleted definiert wird, obwohl er als defaulted deklariert wurde, wird von overload resolution nicht berücksichtigt.