C ++ 11% %code% Schlüsselwort ist großartig.
Meiner Meinung nach ist ein Typ jedoch Nicht normal (siehe zum Beispiel Was ist ein" Regular Type "im Kontext der Bewegungssemantik? ) die Verwendung von %code% wird schwierig.
Gibt es eine Möglichkeit, die %code% -Deklaration für diesen Typ zu deaktivieren?
Angenommen, eine Klasse %code% emuliert eine Referenz
%Vor%(im wirklichen Leben wäre es eine kompliziertere Klasse, der wichtige Punkt ist, dass die vorhandene Klasse nicht regelmäßig ist.)
Die einzige Möglichkeit, %code% nicht zu verwenden (einen Kompilierfehler zu geben) besteht darin, die Klasse nicht kopierbar zu machen. Allerdings muss die Klasse einen Kopierkonstruktor haben (mit einer speziellen Semantik, aber einem Kopierkonstruktor).
Gibt es eine Möglichkeit, die Syntax %code% irgendwie zu deaktivieren? wenn %code% nicht regulär ist.
(Noch besser könnte es sein, dem Compiler mitzuteilen, was %code% genau machen soll).
Hinweis: Dies ist kein sehr künstliches Problem, man könnte sehen, dass diese Art von Problem im Kern von %code% liegt (was auch ein Referenzwrapper ist). Das Deaktivieren von (irgendwie) der Syntax %code% würde das Problem von %code% nicht lösen, aber es wird eine schlechte Verwendung schwieriger machen.
Vermisse ich etwas? Sollte ich einen anderen Teil des Designs ändern? Sollten die nicht regulären Klassen eine Typeigenschaft haben, die dem Compiler helfen würde, eine allgemeinere automatische Bestimmung zu ermitteln (z. B. deducce %code% für %code% wo %code% .)
Ein Kopierkonstruktor bedeutet, dass Sie erwarten, dass die Klasse kopiert wird. %code% erstellt eine Kopie von %code% in %code% .
Wenn Sie eine spezielle Kopie wünschen, die nicht automatisch ausgeführt werden soll, können Sie ein Proxy-Objekt verwenden.
%Vor%Jetzt können wir:
%Vor%und jetzt muss jeder Versuch, %code% zu kopieren, durch einen Aufruf von %code% ausgeführt werden, und die Verwendung von %code% ist niemals legal, weil nichts einen Kopierkonstruktor hat.
Sie können den Kopierkonstruktor auch als privat definieren und ihn zum Implementieren des %code% -Kopierkonstruktors verwenden.
Beachten Sie, dass die Bedeutung von copy / move ctor durch Elisionsregeln in C ++ eingeschränkt ist.
In C ++ 17 Vorlage Klasse Typ Abzug könnte machen:
%Vor%Und %code% wäre ein %code% .