Gibt es eine Möglichkeit, die automatische Deklaration für nicht reguläre Typen zu deaktivieren?

9

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

%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, 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 .)

    
alfC 30.11.2016, 12:16
quelle

1 Antwort

3

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 .

    
Yakk 30.11.2016 15:30
quelle

Tags und Links