C ++ 11% auto
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 auto
wird schwierig.
Gibt es eine Möglichkeit, die auto
-Deklaration für diesen Typ zu deaktivieren?
Angenommen, eine Klasse ref
emuliert eine Referenz
(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, auto r = rd
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 auto r = rd
irgendwie zu deaktivieren? wenn decltype(rd)
nicht regulär ist.
(Noch besser könnte es sein, dem Compiler mitzuteilen, was auto
genau machen soll).
Hinweis: Dies ist kein sehr künstliches Problem, man könnte sehen, dass diese Art von Problem im Kern von std::vector<bool>::reference
liegt (was auch ein Referenzwrapper ist). Das Deaktivieren von (irgendwie) der Syntax auto b = v[10]
würde das Problem von std::vector<bool>
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 bool
für auto b = v[10]
wo std::vector<bool> v
.)
Ein Kopierkonstruktor bedeutet, dass Sie erwarten, dass die Klasse kopiert wird. auto x = y;
erstellt eine Kopie von y
in x
.
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, strange
zu kopieren, durch einen Aufruf von pseudo
ausgeführt werden, und die Verwendung von auto
ist niemals legal, weil nichts einen Kopierkonstruktor hat.
Sie können den Kopierkonstruktor auch als privat definieren und ihn zum Implementieren des psuedo
-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 a.v
wäre ein int
.
Tags und Links c++ c++11 auto regular-type